在rails控制器中保存文档

时间:2014-06-26 12:58:21

标签: ruby-on-rails ruby

我有一个模特,"委屈"。申诉可以附上许多文件。文档可以与各种事物相关联,因此它们是多态的。

这是申诉模式

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

现在我欣赏他的代码比更多更高级,当然更简洁,但我想要了解的是为什么他的代码成功保存文档,而我的代码没有。我可以在日志中看到表单将文档的详细信息传递回控制器,所以它必须与更新代码有关吗?

1 个答案:

答案 0 :(得分:2)

在您的版本中,@greivance在加载和保存之间没有任何操作。

你遗失了这样的东西:

@grievance.update_attributes(params[:grievance])

在这些参数中,是来自设置@grievance值的表单的属性,以及它的嵌套属性来保存附加的文档。

其他开发者的版本正在使用Inherited Resources,它会自动完成所有这些操作。它们只是覆盖了与InheritedResources默认值不同的功能。