Ruby on Rails ActiveRecord::AssociationTypeMismatch (红宝石轨道 ActiveRecord::关联类型不匹配)

4
我正在尝试为我的网站创建一个私人消息系统,目前正在处理消息回复。但是我遇到了ActiveRecord :: AssociationTypeMismatch问题。这是错误消息:
在RepliesController#create中的ActiveRecord :: AssociationTypeMismatch
消息(#58297820)预期得到String(#1635350)
我一直在努力找出问题所在,但一直没有成功。
下面是我的迁移,模型,视图和控制器的代码。
def self.up
create_table :replies do |t|
  t.integer :message_id, :null => false
  t.integer :sender_id, :null => false
  t.text :message, :null => false
  t.timestamps
end
end

模型

class Reply < ActiveRecord::Base
belongs_to :message

validates_presence_of :message

cattr_reader :per_page
@@per_page = 10
end

查看

<% form_for(@reply) do |f| %>
<table>
                    <tr>
                        <td><%= f.text_area :message %></td>
                    </tr>
                    <%= f.hidden_field :message_id, :value => @message.id %>
                    <tr>
                        <td><%= f.submit 'Reply', :id => 'replySubmit' %></td>
                    </tr>
                </table>


            <% end %>

控制器

def create
account = Account.getAccountById(session[:user])
message = Message.find(
    params[:reply][:message_id],
    :conditions => ["messages.account_id=? or messages.sender_id=?", account.id, account.id]
  )
if message
  @reply = Reply.new
  @reply.message_id = message.id
  @reply.sender_id = account.id
  @reply.message = params[:reply][:message]
  if @reply.save
    flash[:message] = "Reply successfully submitted."
    redirect_to(messages_path)
  else
    flash[:warning] = "Message cannot be blank."
    redirect_to(messages_path)
  end
else
  redirect_to(messages_path)
end
rescue ActiveRecord::RecordNotFound
render :template => "error"
end

非常感谢您提供的任何帮助。我将继续尝试找出问题所在。

谢谢。

更新:堆栈跟踪

RAILS_ROOT: C:/Users/redbush/Desktop/biomixr
Application Trace | Framework Trace | Full Trace

C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record     /associations/association_proxy.rb:259:in `raise_on_type_mismatch'
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/belongs_to_association.rb:22:in `replace'
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations.rb:1287:in `message='
C:/Users/redbush/Desktop/biomixr/app/controllers/replies_controller.rb:14:in `create'

请求

参数:

{"commit"=>"Reply",
"reply"=>{"message"=>"sssss",
"message_id"=>"4"},
"authenticity_token"=>"SMVfiolNAVPmLLU0eOWzx2jPFbujMtpyqQcs6A2Mxr0="}

显示会话转储 响应
标头:
{"Content-Type"=>"",
"Cache-Control"=>"no-cache"}

好的帖子,你能否包含在遇到错误时获取的堆栈跟踪信息? - Devin M
你是指命令提示符上打印出来的内容吗?如果是的话,它没有显示任何东西。 - Brian
在网页本身中,查看此处以获取更多信息http://asciicasts.com/episodes/24-the-stack-trace。这应该是您发布的错误消息下面的文本,通常引用项目中的文件,并在其后加上行号。 - Devin M
我更新了我的帖子并附上了堆栈跟踪。希望这有所帮助。 - Brian
3个回答

5
你的问题是你有一个与message相关的关系,你还想在同一模型上使用一个名为message的文本字段。当你创建一个关系时,你可以访问一些新的方法,这些方法会影响其他getter和setter。
为了解决这个问题,将文本字段的名称更改为另一个名称,并在控制器中反映这些更改。
如果需要更多细节,请告诉我。

非常感谢您的帮助!我将 :message 重命名为 :reply_message,现在一切都正常了。 - Brian

1

belongs_to关系在您的模型上创建了一个消息属性,该属性期望类型为Message的对象。然而,您还有一个类型为字符串(string)的消息属性。您可以通过以下方式解决此问题:

belongs_to :my_message, :class_name => :message

相关的消息将会以my_message的形式提供,而文本字段将会以message的形式提供。 总的来说,看起来你试图自己处理太多关系工作 - 让Rails为你完成这项工作。


0

你的模型设计存在冲突。你同时拥有一个名为 message 的关联和属性。

你遇到的错误是因为 Rails 希望你填充关联而不是属性。

我建议将你的属性从 message 改为 message_text,像这样:

@reply = Reply.new
@reply.message_id = message.id
@reply.sender_id = account.id
@reply.message_text = params[:reply][:message]

请在您的迁移文件中进行更改并运行它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接