1

次のように、別のモデルを参照するモデルがあります。

class Message < ActiveRecord::Base
  belongs_to :category
  attr_accessible :content
end

私のフォームは次のようになります。

<%= form_for(Message.new) do |f|%>
  <%= f.hidden_field :category, :value => Category.first.id %>
  <%= f.text_area :content %>
  <%= f.submit %>
<%end%>

これを送信すると、次のようになります。

ActiveRecord::AssociationTypeMismatch in MessagesController#create
Category(#70229327985340) expected, got String(#70229321568640)

モデルが正しい参照で作成されるように、これを正しく行うにはどうすればよいですか?

フォーム フィールドを に変更し、モデルにcategory_idを追加category_idすることで機能するようになりました。attr_accessibleこれは正しい方法ですか?

4

3 に答える 3

0

モデルに関連付けが定義されている場合

  <%= form_for([@category, @message]) do |f| %>
      ...
      ...
   <% end %>

ここで、@category = Category.find(params[:id]) および @message = Message.new です。(これらはコントローラーにある必要があります)。これにより外部キーが割り当てられ、非表示フィールドは不要になります。

于 2012-06-27T05:00:58.353 に答える
0

はい、ここで正しい軌道に乗っていると思います。フォーム フィールド名は、「一括割り当て」でこの値を設定できるようにする必要がcategory_idあります。attr_accessible :category_idするときに使用するテクニックはどれですかMessage.create(params[:message])。がないattr_accessible場合、category_id は nil に設定されます。

于 2012-06-27T03:58:40.190 に答える
0

現在のコードでは、フォーム フィールドは である必要がありcategory_idます。カテゴリへの参照を保存していません。これは、行うべきことです。

Category.firstカテゴリを保存し、フォームをそのままにしておくには、実際には . これでうまくいくと思います。最後にレールで遊んでから 1 週間ほど経ちましたが、私の知識はそれほど多くありません。

また、IDattr_accessibleは自動的に割り当てられるため、変更しないでください。

于 2012-06-27T02:40:14.453 に答える