rails 4--用户期望,得到了字符串

use*_*289 2 ruby ruby-on-rails ruby-on-rails-4

我的rails应用程序内置了一个简单的消息传递系统.

该表如下所示:

create_table :messages do |t|
  t.integer :from_id
  t.integer :to_id
  t.string :subject
  t.text :message

  t.timestamps
end
Run Code Online (Sandbox Code Playgroud)

模型也很简单:

belongs_to :to_id, class_name: "User", :foreign_key => "to_id"
belongs_to :from_id, class_name: "User", :foreign_key => "from_id"
Run Code Online (Sandbox Code Playgroud)

但是,当我提交消息表单时,我得到了一个type mismatch,当我尝试在rails控制台中创建新消息时,它会抛出相同的错误.

User(#-588576898) expected, got String(#-603326958)
Run Code Online (Sandbox Code Playgroud)

显然,它期待的是一个User对象,而不仅仅是user.id价值.我认为这是由于我创建模型的错误?

我哪里做错了?

编辑:

表格代码如下.但是,请注意我在Message从Rails控制台直接创建时遇到了同样的问题,所以我假设它是模型:

> 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)
Run Code Online (Sandbox Code Playgroud)

这是表单,剥离标签和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 %>
Run Code Online (Sandbox Code Playgroud)

小智 5

尝试为您的关系命名其他名称,例如 to_user 和 from_user 。然后您可以在创建消息时使用这些名称。


Fre*_*ung 5

关联的名称(第一个参数belongs_to)不应与包含外键的列的名称相同.

例如

belongs_to :to, class_name: "Message"
Run Code Online (Sandbox Code Playgroud)

目前的情况是,为关联生成的访问器方法会遮蔽属性的访问器方法.