Rails嵌套表单 - 重构创建操作|茧宝石

时间:2016-05-30 11:01:12

标签: ruby-on-rails nested-forms has-many cocoon-gem

一切正常但我想将创建操作中的代码更改为更新操作中的代码。现在,在创建操作中,我循环遍历所有值并保存它们,但希望在一行中完成。

我有一个大学模特。

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.

有人可以帮我解决这个问题吗?

2 个答案:

答案 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),那么createupdate之间的区别是什么,以及为什么不总是渲染,这有点令人困惑在这种情况下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;。我在手机上,所以格式化不好大声笑我把代码放在引号中。