【问题标题】:Ruby on Rails ActiveRecord::AssociationTypeMismatchRuby on Rails ActiveRecord::AssociationTypeMismatch
【发布时间】:2011-08-09 06:59:44
【问题描述】:

我正在尝试为我的网站创建一个私人消息系统,我目前正在处理消息回复。但是,我遇到了 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

如果能提供任何帮助,我将不胜感激。我会继续努力找出问题所在。

谢谢。

更新:堆栈跟踪

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

【问题讨论】:

  • 好帖子,你能把你遇到错误时得到的堆栈跟踪包括进来吗?
  • 您指的是在命令提示符下打印的内容吗?如果是这样,它不会显示任何内容。
  • 在网页本身中,请参阅此以获取更多信息asciicasts.com/episodes/24-the-stack-trace 它应该是您发布的错误消息下方的文本,通常引用您项目中的文件,并在其后加上行号。跨度>
  • 我用堆栈跟踪更新了我的帖子。希望这会有所帮助。

标签: ruby-on-rails


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的帮助!我将 :message 重命名为 :reply_message 并且效果很好。
  • 欢迎您,如果它解决了您的问题,请不要忘记接受答案。
【解决方案2】:

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

belongs_to :my_message, :class_name => :message

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

【讨论】:

    【解决方案3】:

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

    您得到的错误是因为 Rails 期望您填写关联而不是属性。

    我建议将您的属性从 message 更改为 message_text,如下所示:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多