0

私は Rails の初心者です。Form と FormType の 2 つのモデルがあります。form_type は 0 または 1 つの form を持つことができます。フォームは 1 つの 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、新しいレコードであるかどうかに基づいて投稿/プットへのルートを修正することはすでにわかっています。

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

(adminフォルダーに)admin名前空間があるようです-その場合は、代わりにこれを使用してください:

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

また、私はあなたのアプリについてあまり知りませんが、フォームモデルのhas_one:formはhas_many:formsである必要があると思われますか?

お役に立てば幸いです。

于 2012-09-09T01:06:10.263 に答える