Ruby on Rails ActiveRecord :: AssociationTypeMismatch

时间:2011-08-09 06:59:45

标签: ruby-on-rails

我正在尝试为我的网站创建一个私人消息系统,我目前正致力于消息回复。我遇到了ActiveRecord :: AssociationTypeMismatch问题。这是错误消息:

RepliesController #create中的ActiveRecord :: AssociationTypeMismatch

消息(#58297820)预期,得到字符串(#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

我很感激提供的任何帮助。我会一直试图找出问题所在。

谢谢。

更新:Stacktrace

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"}

3 个答案:

答案 0 :(得分:5)

您的问题是您与message有关系,并且您还希望在名为message的同一模型上使用文本字段。当你创建一个关系时,你可以访问一些新方法,这些方法会踩到其他getter和setter的脚下。

要解决此问题,请将文本字段的名称更改为其他名称,并反映控制器中的更改。

如果您需要更多详细信息,请告诉我们。

答案 1 :(得分:1)

belongs_to关系在模型上创建一个消息属性,该属性需要一个Message类型的对象。但是,您还有一个string类型的message属性。您可以使用以下方法解决此问题:

belongs_to :my_message, :class_name => :message

相关消息将以my_message的形式提供,而文本字段将显示为message。 一般来说,您似乎正在尝试自己处理太多的关系工作 - 让rails为您完成工作。

答案 2 :(得分: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]

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