我正在尝试为我的网站创建一个私人消息系统,我目前正致力于消息回复。我遇到了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"}
答案 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]
请在迁移文件中进行更改并运行它。