2012-05-01 2 views
0

私は自分のアプリケーションにメッセージング機能を実装していますが、receiver_idを保持するのは難しいです。receiver_idは保存していません - レールメッセージ

ユーザモデル:

class User < ActiveRecord::Base 
    has_many :tickets 
    has_many :sent_messages, :class_name => 'Message', :foreign_key => 'sender_id', :dependent => :destroy 
    has_many :received_messages, :class_name => 'Message', :foreign_key => 'receiver_id', :dependent => :destroy 
end 

メッセージモデル:

class Message < ActiveRecord::Base 
    belongs_to :sender, :class_name => 'User', :foreign_key => 'sender_id' 
    belongs_to :receiver, :class_name => 'User', :foreign_key => 'receiver_id' 
end 

メッセージコントローラ:

def new 
    @user = User.find(params[:user_id]) 
    @message = Message.new( 
     :receiver => @user) 
end 

def create 
    @message = current_user.sent_messages.create(params[:message]) 
    redirect_to(tickets_path, :message => 'Message has been sent.') 
end 

receiver_idデシベルにはヌルのままです。

ありがとうございました!

EDITは

ルートはここに質問 - ticket has users that can send messages - rails messaging

+0

:あなたはform_forを使用していると仮定すると、それはそうようなものになるだろう。 –

+0

私は別の質問でルートについて質問します。 –

答えて

1

HTTPはステートレスなので、各要求は、その前に1(S)について何も知りません。したがって、コントローラーでMessage.newを呼び出すときに属性を設定しても、create要求には引き継がれません。それを含む非表示のフォームフィールドが必要です。これは実際には2つの完全に異なる質問です

<%= f.hidden_field :receiver_id %> 
+0

ありがとう、それはそのトリックでした。隠しフィールドを使用しないソリューションがありますか? –

+1

セッションに保存することはできますが、それは解決するよりも多くの問題を引き起こす可能性があります(たとえば、ユーザーが同時にフォームを2回開いた場合など)。 HTTPの仕組みを考えれば、本当に良い方法はありません。 –

関連する問題