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

使用您当前的代码,表单字段应该是category_id,因为这就是您要存储的内容。您没有存储对类别的引用,这是您应该做的。

它应该只是Category.first, 来存储类别,并保持原样。我认为这会奏效,距离我上次玩 Rails 已经有一周左右的时间了,而且我的知识并不丰富。

此外,ID 不应为attr_accessible,因为它们是自动分配的,不应更改。

于 2012-06-27T02:40:14.453 回答
0

是的,我认为你在正确的轨道上。表单字段名称应该category_id并且attr_accessible :category_id允许您通过“批量分配”设置此值。当你这样做时使用的是哪种技术Message.create(params[:message])。如果没有attr_accessible, category_id 将被设置为 nil。

于 2012-06-27T03:58:40.190 回答
0

如果您的模型定义了关联

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

其中@category = Category.find(params[:id]) 和@message = Message.new。(这些应该在您的控制器中)。这将分配外键,并且不需要隐藏字段。

于 2012-06-27T05:00:58.353 回答