私はレールにプライベートメッセージシステムを実装しようとしています、そしてこれは私のテーブルです:
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_id
user 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
ありがとう