将路径路径作为方法参数传递,而不首先对其进行评估

时间:2014-06-23 09:47:02

标签: ruby ruby-on-rails-4 routes parameter-passing

我有一个简单validates :name, presence: true验证的组织模型。

为了干掉一些代码我有一个"帮助"我的ApplicationController中的方法如下:

def handle_errors(object, message, origin, target)
  if object.invalid?
    yield if block_given?
    render(origin)
  else
    redirect_to(target, flash: { notice: message })
  end
end

这适用于update操作:

@organization = Organization.find(params[:id])
@organization.update(organization_params)
handle_errors @organization, "Updated organization", 'edit', organization_path(@organization)

然而,在create行动中

@organization = Organization.new(organization_params)
@organization.save
handle_errors @organization, "Updated organization", 'new', organization_path(@organization)

如果验证失败(即输入空白名称字段)并且错误

,它会中断
No route matches {:action=>"show", :controller=>"organizations", :id=>nil} missing required keys: [:id]

缺少ID键,因为@organization未保存且@organization.id = nil。由于路径路径方法在传递给handle_errors方法之前进行了评估,因此会生成错误。

我想做的是"评估路线路径"稍后(仅在else - handle_errors方法的情况下)。一种方法是将路径路径包装在lambda块中,并按如下方式调用方法:

handle_errors @organization, "Updated organization", 'new', lambda {organization_path(@organization)}

另一种解决问题的方法是,不是将路径路径传递给handle_errors方法,而是传递对象(或嵌套资源和自定义动作名称的数组)

handle_errors @organization, "Updated organization", 'new', [@organization]

但是有没有其他方法以更加ruby / rails导向的方式做到这一点?

0 个答案:

没有答案