2010-02-17 48 views
0

在大多数我看到的例子验证形式,我注意到,在控制器,新方法只需有:与变量

@object = Object.new 

在创建方法,你会看到类似这样的:

@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:值

的“渲染:行动=>‘新’将被调用。因此,然后轨绕过控制器,并直接到新的行动,试图呈现的形式。

控制器的旁路杀死我,因为有时我用我在我的控制器定义的值装载值到表单中。

因为rails会绕过控制器,并且在加载“render:action =>'new'”时从未设置过值,所以我最终会得到nil值的错误。

我的问题:在验证一个表单中已经定义了控制器中定义的变量的表单时,什么是重定向表单的最佳方式(或通常的最佳实践)?我想避免那些无价值的错误,所以我想我刚开始时做错了。

回答

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 
+0

啊哈!答案正在我的脸上。我之前使用过滤器来构建其他东西,而且我从来没有将它用于表单。谢谢! :) – Steve 2010-02-17 19:48:23

0

一种方法:使所有这些变量的隐藏字段,所以你的目标就已经让他们在create的行动。 另一种方法:创建这两个动作before_filter

个人而言,我会选择第二个选项去。