我有一个模特,"委屈"。申诉可以附上许多文件。文档可以与各种事物相关联,因此它们是多态的。
这是申诉模式
class Grievance < ActiveRecord::Base
belongs_to :account
belongs_to :employee
has_many :documents, :class_name => "EmployeeDocument", :as => 'documentable'
accepts_nested_attributes_for :documents, :allow_destroy => true
end
申诉的显示页面允许用户上传与申诉相关联的多个文档。这非常有效。
我正在重构另一个开发人员的代码,并查看控制器中的更新操作。他的代码看起来像这样......
def update
@grievance = @employee.grievances.find(params[:id])
update! {
flash[:notice] = 'Updated successfully'
redirect_to edit_employee_grievance_path(:employee_id => @employee.id, :id => @grievance, :tab_to_return_to => params[:tab_to_return_to]) and return }
render :form
end
虽然这很好用,但我想重构它,基本上是为了让它在我学习时更具可读性。所以我改成了它。
def update
@grievance = @employee.grievances.find(params[:id])
if @grievance.save
flash[:notice] = "#{@grievance.grievance_type} record updated"
redirect_to employee_grievance_path(@employee, @grievance) and return
else
flash[:alert] = "There was a problem editing the record"
render :edit
end
现在我欣赏他的代码比更多更高级,当然更简洁,但我想要了解的是为什么他的代码成功保存文档,而我的代码没有。我可以在日志中看到表单将文档的详细信息传递回控制器,所以它必须与更新代码有关吗?
答案 0 :(得分:2)
在您的版本中,@greivance
在加载和保存之间没有任何操作。
你遗失了这样的东西:
@grievance.update_attributes(params[:grievance])
在这些参数中,是来自设置@grievance
值的表单的属性,以及它的嵌套属性来保存附加的文档。
其他开发者的版本正在使用Inherited Resources,它会自动完成所有这些操作。它们只是覆盖了与InheritedResources默认值不同的功能。