Ruby on rails 以简单形式验证@form的f.关联

Ruby on rails 以简单形式验证@form的f.关联,ruby-on-rails,validation,Ruby On Rails,Validation,我是rails的新手。我有两个模型:表单和表单类型。表单类型可以有零个或一个表单。表单只属于一个表单类型。为此,我创建了如下模型: class FormType < ActiveRecord::Base has_one :form attr_accessible :name end class Form < ActiveRecord::Base belongs_to :form_type validates :name, :presenc

我是rails的新手。我有两个模型:表单和表单类型。表单类型可以有零个或一个表单。表单只属于一个表单类型。为此,我创建了如下模型:

 class FormType < ActiveRecord::Base

    has_one :form
    attr_accessible :name

 end 


 class Form < ActiveRecord::Base
   belongs_to :form_type

   validates :name, :presence => true
   validates_presence_of :form_type 

   attr_accessible :name, :enabled

 end
结束


我可以看到服务器端名称字段的valdiation被激发,但无法验证关联。是否有人可以指出我的错误或一些有用的文章来解决此问题。

这很可能是因为您在create方法中分配属性的方式。你现在的做法并不标准

特别是这一行可能是罪魁祸首,因为如果你不传递一个值,它将是0,因为你是通过调用.to_i来铸造这个值的。因此,无论:form_type的有效_存在是什么,它都将变得无用:

@form.form_type_id = params[:form][:form_type_id].to_i
ie/
nil.to_i
等于将通过验证的
0

请尝试以下创建方法:

def create
    @form = Form.new(params[:form]) #mass assignment
    if @form.save
        redirect_to :action => 'index'
    else
        render action: "new"
    end
end
在表单模型中,确保已将希望允许质量分配的值列为白名单。在这种情况下-
attr\u accessible:name、:enabled、:form\u type\u id

同样,在html文件中的simple_form_for方法中,当您复制rails的功能时,它已经知道如何根据
@form
是否为新记录来更改请求并将路由更改为post/put

:url => @form.new_record?() ? admin_forms_path : admin_form_path,
:method => @form.new_record?() ? 'post':'put'
看起来您有一个管理名称空间(在管理文件夹中)-如果是这种情况,请使用以下名称空间:

<%= simple_form_for([:admin, @form]) do |f| %>

另外,我不太了解你的应用程序,但怀疑表单模型上的has_one:form应该是has_many:forms


希望有帮助

您也需要发布控制器代码,因为它们有太多问题,例如为什么要将:url和:方法传递到simple_form_for方法中?您不必这样做,您的对象实例是否也被称为@business\u form或@form?就像你们两个在一起一样html@ADAM我现在有控制器代码。我的对象是form not business\u FormThank@ADAM,谢谢你的详细回答。但是,即使我将form\u type\u id添加到attr\u可访问列表中,我也无法计算出来。此外,我得到的是name字段而不是select字段的验证消息,即使它是在提交时,表单模型中的type selectbox留空。请放入
attr\u accessible:Form\u type\u id
,然后在表单html中尝试“而不是f”。输入:name
:url => @form.new_record?() ? admin_forms_path : admin_form_path,
:method => @form.new_record?() ? 'post':'put'
<%= simple_form_for([:admin, @form]) do |f| %>