0

私はレールにプライベートメッセージシステムを実装しようとしています、そしてこれは私のテーブルです:

create_table :messages do |t|
  t.integer    :sender_id,          :null => false
  t.integer    :recipient_id,       :null => false
  t.text       :content
  t.boolean    :read,               :null => false, :default => false

  t.timestamps
end

これが私のmessageモデルです:

  attr_accessible :recipient_id, :sender_id, :content

  belongs_to :user

  validates_presence_of :recipient_id, :sender_id, :content

  before_validation :recipient

  def recipient
    self.recipient_id = User.find_by_email(self.recipient_id.to_s).id
  end

と私のフォーム:

<%= form_for @message, :url => {:action => 'index'}, :as => :message do |message| %>
  <%= message.text_field :recipient_id, :placeholder => "to" %>

  <%= message.text_area :content, :placeholder => "i am saying..."%>

  <%= message.submit "Send" %>
<% end %>

およびコントローラー:

def create
  @message = Message.new(params[:message])
  @message.sender_id = current_user

  if @message.save
      set_flash "Message sent"
      render 'index'
  else
      set_flash "Message Failed"
      render 'index'
  end

終わり

アイデアは、ユーザー1がテキストフィールド内にuser2の電子メールを入力すると、検証前にユーザー2のIDが起動され、彼の電子メールに基づいて取得されますが、試してみると次のエラーが発生します。recipient_iduser table

undefined method `to_i' for #<User:0x00000004344780>

何が問題ですか?

編集:

これはエラーをスローする行です:

@message.sender_id = current_user

私がそれに変更current_userするcurrent_user.idと、このエラーが発生します:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

この行で:

    self.recipient_id = User.find_by_email(self.recipient_id.to_s).id

ありがとう

4

1 に答える 1

1

createメソッドでこれを試してください。

@message.sender_id = current_user.id

これの代わりに@message.sender_id = current_user

整数を期待しているときにオブジェクトを設定sender_idしていると思います。current_userid

編集:

新しいエラーの場合、User.find_by_emailメソッドはレコードを見つけることができないため、を返しnilます。

コードにも問題があります。

self.recipient_id = User.find_by_email(self.recipient_id.to_s).id

で設定self.recipient_idおよび検索していself.recipient_idます。どこかに設定されていない限りself.recipient_idそうです。nilself.recipient_id

に一致する受信者がデータベースにあった場合self.recipient_id、このコードは何もしません。に設定self.recipient_idされself.recipient_idます。

于 2013-03-24T15:58:09.717 に答える