Ruby on Rails ActiveRecord :: AssociationTypeMismatch - PullRequest
4 голосов
/ 09 августа 2011

Я пытаюсь создать систему личных сообщений для своего веб-сайта, и в настоящее время я работаю над ответами на сообщения.Однако я столкнулся с проблемой ActiveRecord :: AssociationTypeMismatch.Это сообщение об ошибке:

ActiveRecord :: AssociationTypeMismatch в RepliesController # create

Ожидается сообщение (# 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 ]

5 голосов
/ 09 августа 2011

Ваша проблема в том, что у вас есть отношение к message, и вы также хотите использовать текстовое поле в той же модели под названием message.Когда вы создаете отношение, у вас есть доступ к некоторым новым методам, которые наступят на ноги другим геттерам и сеттерам.

Чтобы исправить это, измените имя текстового поля на другое имя и отразите изменения в вашем контроллере..

Если вам нужно больше деталей, дайте мне знать.

1 голос
/ 09 августа 2011

Отношение own_to создает атрибут сообщения в вашей модели, который ожидает объект типа Message. Однако у вас также есть атрибут сообщения типа строка. Вы можете обойти это, используя:

belongs_to :my_message, :class_name => :message

И соответствующее сообщение будет доступно как my_message, а текстовое поле будет доступно как message. В общем, кажется, что вы пытаетесь справиться со слишком большой частью работы над отношениями самостоятельно - пусть рельсы сделают всю работу за вас.

0 голосов
/ 09 августа 2011

У вас есть конфликт в дизайне вашей модели. У вас есть связь и атрибут с именем message.

Ошибка, которую вы получаете, заключается в том, что Rails ожидает, что вы заполните ассоциацию вместо атрибута.

Я предлагаю изменить ваш атрибут с message на message_text, например так:

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

Внесите изменения в файл миграции и запустите его тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...