Rails 5:模型的嵌套属性未更新
Rails 5: Nested attributes aren't updated for model
我无法让 rails 更新我的嵌套属性,尽管常规属性可以正常工作。这是我的结构:
unit.rb:
class Unit < ApplicationRecord
has_many :unit_skill_lists
has_many :skill_lists, through: :unit_skill_lists, inverse_of: :units, autosave: true
accepts_nested_attributes_for :skill_lists, reject_if: :all_blank, allow_destroy: true
end
unit_skill_list.rb:
class UnitSkillList < ApplicationRecord
belongs_to :unit
belongs_to :skill_list
end
skill_list.rb:
class SkillList < ApplicationRecord
has_many :unit_skill_lists
has_many :units, through: :unit_skill_lists, inverse_of: :skill_lists
end
这是控制器(的一部分):
class UnitsController < ApplicationController
def update
@unit = Unit.find(params[:id])
if @unit.update(unit_params)
redirect_to edit_unit_path(@unit), notice: "Unit updated"
else
redirect_to edit_unit_path(@unit), alert: "Unit update failed"
end
end
private
def unit_params
unit_params = params.require(:unit).permit(
...
skill_list_attributes: [:id, :name, :_destroy]
)
unit_params
end
end
表格中的相关行(使用formtastic和cocoon):
<%= label_tag :skill_lists %>
<%= f.input :skill_lists, :as => :check_boxes, collection: SkillList.where(skill_list_type: :base), class: "inline" %>
知道我哪里出错了吗?我已尝试按照我能找到的所有指南进行操作,但更新对嵌套属性没有任何作用。
在 Vasilisa 的帮助下编辑:
这是我尝试更新单元时的错误:
ActiveRecord::RecordInvalid (Validation failed: Database must exist):
这是完整的 unit_skill_list.rb:
class UnitSkillList < ApplicationRecord
belongs_to :unit
belongs_to :skill_list
belongs_to :database
end
"database" 没有输入字段。它应该在更新单元时从会话变量中设置。
如果您查看服务器日志,您会在参数哈希中看到类似 skill_list_ids: []
的内容。您不需要 accepts_nested_attributes_for :skill_lists
,因为您没有在单元 create/update 上创建新的 SkillList。将允许的参数更改为:
def unit_params
params.require(:unit).permit(
...
skill_list_ids: []
)
end
更新
我认为这里最好的选择是设置 optional
参数 - belongs_to :database, optional: true
。并在控制器中手动更新它。
def update
@unit = Unit.find(params[:id])
if @unit.update(unit_params)
@unit.skill_lists.update_all(database: session[:database])
redirect_to edit_unit_path(@unit), notice: "Unit updated"
else
redirect_to edit_unit_path(@unit), alert: "Unit update failed"
end
end
我无法让 rails 更新我的嵌套属性,尽管常规属性可以正常工作。这是我的结构:
unit.rb:
class Unit < ApplicationRecord
has_many :unit_skill_lists
has_many :skill_lists, through: :unit_skill_lists, inverse_of: :units, autosave: true
accepts_nested_attributes_for :skill_lists, reject_if: :all_blank, allow_destroy: true
end
unit_skill_list.rb:
class UnitSkillList < ApplicationRecord
belongs_to :unit
belongs_to :skill_list
end
skill_list.rb:
class SkillList < ApplicationRecord
has_many :unit_skill_lists
has_many :units, through: :unit_skill_lists, inverse_of: :skill_lists
end
这是控制器(的一部分):
class UnitsController < ApplicationController
def update
@unit = Unit.find(params[:id])
if @unit.update(unit_params)
redirect_to edit_unit_path(@unit), notice: "Unit updated"
else
redirect_to edit_unit_path(@unit), alert: "Unit update failed"
end
end
private
def unit_params
unit_params = params.require(:unit).permit(
...
skill_list_attributes: [:id, :name, :_destroy]
)
unit_params
end
end
表格中的相关行(使用formtastic和cocoon):
<%= label_tag :skill_lists %>
<%= f.input :skill_lists, :as => :check_boxes, collection: SkillList.where(skill_list_type: :base), class: "inline" %>
知道我哪里出错了吗?我已尝试按照我能找到的所有指南进行操作,但更新对嵌套属性没有任何作用。
在 Vasilisa 的帮助下编辑:
这是我尝试更新单元时的错误:
ActiveRecord::RecordInvalid (Validation failed: Database must exist):
这是完整的 unit_skill_list.rb:
class UnitSkillList < ApplicationRecord
belongs_to :unit
belongs_to :skill_list
belongs_to :database
end
"database" 没有输入字段。它应该在更新单元时从会话变量中设置。
如果您查看服务器日志,您会在参数哈希中看到类似 skill_list_ids: []
的内容。您不需要 accepts_nested_attributes_for :skill_lists
,因为您没有在单元 create/update 上创建新的 SkillList。将允许的参数更改为:
def unit_params
params.require(:unit).permit(
...
skill_list_ids: []
)
end
更新
我认为这里最好的选择是设置 optional
参数 - belongs_to :database, optional: true
。并在控制器中手动更新它。
def update
@unit = Unit.find(params[:id])
if @unit.update(unit_params)
@unit.skill_lists.update_all(database: session[:database])
redirect_to edit_unit_path(@unit), notice: "Unit updated"
else
redirect_to edit_unit_path(@unit), alert: "Unit update failed"
end
end