我有一个简单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导向的方式做到这一点?