在我看到的大多数例子中,我注意到在控制器中,新方法只有:
@object = Object.new
在create方法中,您会看到如下内容:
@object = Object.find(params[:object])
if @object.save
flash[:success] = "This object has been added."
redirect_to objects_path
else
render :action => 'new'
end
这样可以正常工作,但我遇到的唯一问题(非常常见)是使用一些内置辅助方法验证失败时:
validates_presence_of:value
将调用“render:action =>'new'。因此,rails会绕过控制器并直接进入new的操作,尝试渲染表单。
绕过控制器会让我失望,因为有时我会使用我在控制器中定义的值将值加载到表单中。
由于nil值,我最终会收到错误,因为rails会绕过控制器,并且在加载“render:action =>'new'”时从未设置过值。
我的问题:在验证控件中定义了变量的表单时,重定向表单(或一般的最佳实践)的最佳方法是什么?我想避免那些零值错误,所以我想我开始时做错了。
答案 0 :(得分:1)
您可以将加载各种值的自定义代码移动到before_filter
,有点像:
before_filter :get_values, :only => [:new, :create]
def new
# your code here
end
def create
@object = Object.new params[:object
if @object.save
flash[:success] = "This object has been added."
redirect_to objects_path
else
render :action => 'new'
end
end
private
def get_values
# your code here
end
答案 1 :(得分:0)
一种方法:为所有变量渲染隐藏字段,以便您的对象在create
操作中已经拥有它们。
另一种方法:为这两个动作创建一个before_filter
。
就个人而言,我会选择第二种选择。