我的rails应用程序内置了一个简单的消息传递系统。
表格如下:
create_table :messages do |t|
t.integer :from_id
t.integer :to_id
t.string :subject
t.text :message
t.timestamps
end
模型也很简单:
belongs_to :to_id, class_name: "User", :foreign_key => "to_id"
belongs_to :from_id, class_name: "User", :foreign_key => "from_id"
但是,当我提交消息表单时,我收到type mismatch
,当我尝试在rails控制台中创建新消息时,它会抛出相同的错误。
User(#-588576898) expected, got String(#-603326958)
显然,它期待一个User
对象,而不仅仅是user.id
值。我认为这是由于我创建模型的错误?
我哪里出错了?
编辑:
表格代码如下。但是,请注意我在从Rails控制台直接创建Message
时遇到了同样的问题,因此我假设它是模型:
> m = Message.new
=> #<Message id: nil, from_id: nil, to_id: nil, subject: nil, message: nil, created_at: nil, updated_at: nil>
> m.from_id = 1
ActiveRecord::AssociationTypeMismatch: User(#-582821898) expected, got Fixnum(#-597136528)
这是表单,剥离标签和HTML:
<%= form_for @message, :url => {:controller => "messages", :action => "create"}, :html => {:class => 'form-horizontal form', :role => 'form'} do |f| %>
<%= f.select :to_id, options_from_collection_for_select(User.all, :id, :first_name) %>
<%= f.text_field :subject %>
<%= f.text_area :message %>
<%= f.submit class: "btn btn-large btn-primary" %>
<% end %>
答案 0 :(得分:5)
关联的名称(belongs_to
的第一个参数)不应与包含外键的列的名称相同。
例如
belongs_to :to, class_name: "Message"
目前的情况是,为关联生成的访问器方法会遮蔽属性的访问器方法。
答案 1 :(得分:4)
尝试为您的关系提供其他名称,可能是to_user和from_user。然后,您可以在创建消息时使用这些名称。