一切正常但我想将创建操作中的代码更改为更新操作中的代码。现在,在创建操作中,我循环遍历所有值并保存它们,但希望在一行中完成。
我有一个大学模特。
class College< ActiveRecord::Base
has_many :staffs, dependent: :destroy
accepts_nested_attributes_for :staffs, reject_if: :all_blank, allow_destroy: true
end
这是我的Staff.rb
class Staff < ActiveRecord::Base
belongs_to :college
end
这些是我的员工控制器创建和更新操作
def create
@college= College.find(params[:college][:id_college_profile]
)
staff_params = params[:college][:staffs_attributes].values
staff_params.each do |staff_param|
@staff = @college.staffs.new
@staff.name = staff_param[:name]
@staff.designation = staff_param[:designation]
@staff.experience = staff_param[:experience]
@staff.specialization = staff_param[:specialization]
@staff.save
end
redirect_to dashboard_path(id: @college.id), notice: "Successfully added Staff."
end
def update
@college= College.find(params[:college][:id_college]
)
@college.update_attributes(staff_parameters)
redirect_to root_path
end
这些是强参数
def staff_parameters
params.require(:college).permit(:id, staffs_attributes: [:id, :name, :specialization, :experience, :designation, :_destroy])
end
有没有办法在创建操作中保存所有人员,而不循环遍历所有值,但是在更新操作中用一行代码保存所有人员?
我在StaffsController创建动作
中尝试了这个def create
@college= College.find(params[:college][:id_college]
)
@staff= @college.staffs.new(staff_parameters)
@staff.save
redirect_to dashboard_path(id: @college.id), notice: "Successfully added Staffs."
end
但它抛出了这个错误
unknown attribute 'staffs_attributes' for Staff.
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
这是CollegesController
,所以我假设create
行动也会创建新的大学?
因此,在这种情况下,您的创建操作应该只是:
def create
@college = College.new(staff_parameters)
if @college.save
# succesfully created
else
# there was a validation error
end
end
请注意,通常我们会使用college_parameters
,因为根元素是college
,您不仅可以编辑嵌套的人员,还可以编辑大学的属性。
如果大学始终存在(因为你正在进行find
),那么create
和update
之间的区别是什么,以及为什么不总是渲染,这有点令人困惑在这种情况下edit
行动?
我有一个demo-project show-casing cocoon和嵌套属性。
答案 1 :(得分:0)
你可以通过很多方式做到这一点。 &#34; staff_parameters&#34;方法抛出错误,因为您在创建操作中的类Staff和更新操作的大学类上调用它。做你想做的最简单的事情是复制人员参数方法强参数并复制它。将第二个方法命名为create_staff并更改&#34; params.require(:college)&#34;部分到&#34; params.require(:staff)&#34;剩下的就是一样的。然后在您的创建操作中,您可以执行&#34; college.staff(create_staff)&#34;。我在手机上,所以格式化不好大声笑我把代码放在引号中。