在simple_form_for @form中验证f.association

时间:2012-09-08 10:13:57

标签: ruby-on-rails validation

我是rails的新手。我有两个模型:Form和FormType.form_type可以有零个或一个form.A表单只属于一个form_type。为此我创建了如下模型:

 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

我的_form.html.erb如下

<%= simple_form_for(@form, :html => { :class => 'form-horizontal' },
 :url => @form.new_record?() ? admin_forms_path : admin_form_path,
 :method => @form.new_record?() ? 'post':'put' ) do |f| %>
<div class="form-inputs">
      <%= f.input :name, :required => true, :autofocus => true %>
      <%= f.association :form_type,:required => true, :hint => "select type" %>
  <%= f.input :enabled %>
</div>

<div class="form-actions">
       <%=  f.button :submit, :class => 'btn-primary' %>
       <% if ! @form.new_record?() %>
       <%= link_to t('.destroy', :default => t("helpers.links.destroy")),
           admin_form_path(@form),
          :method => 'delete',
          :confirm => t('.confirm', :default => t("helpers.links.confirm")),
          :class => 'btn btn-danger' %>
       <% end %>
 </div>
 <% end %>

这是我的控制器代码。

def create
@form = Form.new
@form.name = params[:form][:name]
@form.enabled = params[:form][:enabled]
@form.form_type_id = params[:form][:form_type_id].to_i
 if @form.save
    redirect_to :action => 'index'
 else
    render action: "new"
 end

我能够看到为名称字段触发的服务器端条件但无法验证关联。任何人都可以指出我的错误或一些有用的文章来解决此问题。

1 个答案:

答案 0 :(得分:0)

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

特别是这一行可能是罪魁祸首,因为如果你没有传递一个值,它将为0,因为你通过调用.to_i来转换值。所以无论validated_presence_of:form_type变得无用:

@form.form_type_id = params[:form][:form_type_id].to_i

即/ 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_accessible :name, :enabled, :form_type_id

同样在你的html文件中的simple_form_for方法中取出以下内容,因为你复制了rails的功能 - 它已经知道根据{{1}是否更改请求并更正路由/发布的路由是不是新记录。

@form

看起来你有一个管理员命名空间(在管理员文件夹中) - 如果是这种情况,请改用:

:url => @form.new_record?() ? admin_forms_path : admin_form_path,
:method => @form.new_record?() ? 'post':'put'

此外,我对您的应用程序了解不多,但怀疑表单模型上的has_one:表单应该是has_many:表单?

希望有所帮助!