0

我是 Rails 的新手。我有两个模型:Form 和 FormType。一个 form_type 可以有零个或一个表单。一个表单只属于一个 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

结尾

我可以看到为名称字段触发了服务器端验证,但无法验证关联。谁能指出我的错误或一些有用的文章来解决这个问题。

4

1 回答 1

0

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

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

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

ie/nil.to_i等于0将通过您的验证

试试这个,而不是你的 create 方法:

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 的功能 - 它已经知道根据是否@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 ?

希望有帮助!

于 2012-09-09T01:06:10.263 回答