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

时间:2014-06-20 22:58:27

标签: ruby-on-rails ruby 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

模型也很简单:

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 %>

2 个答案:

答案 0 :(得分:5)

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

例如

belongs_to :to, class_name: "Message"

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

答案 1 :(得分:4)

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