Rails 不更新嵌套属性

Rails doesn't update nested attributes

我创建了一个应用程序,它基本上是一个具有交互式和动态形式的 RPG 角色创建器。我使用 Rails 5.0.0.1,但无法正确更新我的表单。基本模型更新良好,但所有嵌套模型更新不佳。

所以,我有

class Character < ApplicationRecord
  has_many :attr4characters, autosave: true
  accepts_nested_attributes_for :attr4characters, allow_destroy: true
end

class Attr4character < ApplicationRecord
  belongs_to :character
end

代表一个角色和他的一组属性。 Attr4character 中的每条记录都是不同的属性。

显示视图很简单:

...
<div class="field">
  <%= f.label :description %>
  <%= f.text_area :description %>
</div>

<div class="field">
  <%= f.label :character_type %>
  <%= f.select(:character_type, options_for_select(["Zhong Lung", "Shih", "Hsien", "Garou", "Technocrat"])) %>
</div>

  <% f.object.attr4characters.each do |attr| %>
    <%= f.fields_for attr do |attr_f| %>
      <div class="field">  
        <%= attr_f.label "Field name" %>
        <%= attr_f.text_field :field_name %>
      </div>
      <div class="field">  
        <%= attr_f.label "Field value" %>
        <%= attr_f.text_field :field_value %>
      </div>
    <% end %>
  <% end %>

  <div class="actions">
    <%= f.submit %>
  </div>
...

最后是我的 characters_controller:

  def update
    respond_to do |format|
      if @character.update(character_params)
        format.html { redirect_to @character, notice: 'Character was successfully updated.' }
        format.json { render :show, status: :ok, location: @character }
      else
        format.html { render :edit }
        format.json { render json: @character.errors, status:  :unprocessable_entity }
      end
    end
  end

  private
    def set_character
      @character = Character.find(params[:id])
    end

    def character_params
      params.require(:character).permit(:id, :name, :player, :description, :character_type, attr4characters_attributes: [:id, :character_id, :field_name, :field_value])
    end

所以,我有一个表单,可以正确显示角色及其所有属性集。当我更新字符字段(如:描述)时,它通常会更新。当我更新任何嵌套字段时,Rails 表示该字符已成功更新并且没有任何变化!我用 Google 搜索,发现 Rails 形式的嵌套属性有很多问题,但是 none 的食谱对我有用。我什至遇到意见认为这是 Rails 4 中的错误,但我使用第 5 版...

请就此主题提出建议。这真的是一个错误吗?还是我做错了什么?我是 Rails 的新手,所以我不排除这种可能性。 :)

顺便说一句,在服务器的日志中我发现有关于attr4characters 的警告。

Processing by CharactersController#update as HTML
  Parameters: {"utf8"=>"\u2713", "authenticity_token"=>"xeYyIRc13YiOk29v18rFM6Oh5OHRRuPpSKEQuIHE/U4uhANEF7TwMp8mb6hv6L7mUAm5MngAuyFayHcWV/Vvbw==", "character"=>{"name"=>"Ray", "player"=>"111", "description"=>"A Zhong Lung suicider", "character_type"=>"Hsien", "attr4character"=>{"field_name"=>"Gift1", "field_value"=>"Sense Wyrm"}}, "commit"=>"Update Character", "id"=>"3"}
  Character Load (0.2ms)  SELECT  "characters".* FROM "characters" WHERE "characters"."id" = ? LIMIT ?  [["id", 3], ["LIMIT", 1]]
Unpermitted parameter: attr4character
   (0.1ms)  begin transaction
  SQL (0.9ms)  UPDATE "characters" SET "character_type" = ?, "updated_at" = ? WHERE "characters"."id" = ?  [["character_type", "Hsien"], ["updated_at", 2016-09-13 14:39:10 UTC], ["id", 3]]
   (24.3ms)  commit transaction

但是在 characters_controller...

中允许使用 attr4 个字符

警告告诉您它忽略了所有 attr4character 属性。您的 permit 代码与您的模型一样正确,但您的视图与它们不匹配。你应该做

f.fields_for :attr4characters do |attr_f|
  ...
end

并让 rails 处理关联的迭代。这也将确保属性被正确命名(因此它们将被您的白名单允许通过)