2012-05-01 34 views
0

我在我的應用程序中實現了我自己的用戶消息傳遞功能,但我難以保留receiver_idreceiver_id不保存 - rails消息

用戶模型:

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在db保持爲空。

感謝您的幫助!

編輯

路線的問題在這裏 - ticket has users that can send messages - rails messaging

+0

這實際上是兩個完全不同的問題。 –

+0

好吧,我會問一個單獨的問題的路線 –

回答

1

HTTP是無狀態的,所以每個請求一無所知面前的一個(或多個)。因此,在控制器中調用Message.new時,設置一個屬性並不會自動轉到create請求 - 您需要有一個包含它的隱藏表單域。假設你使用的是form_for,它會是這樣的:

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

謝謝,這是做的伎倆。你有沒有使用隱藏字段的解決方案? –

+1

您可以將它存儲在會話中,但這可能會導致比解決問題更多的問題(例如,如果用戶同時打開表單兩次,該怎麼辦?)。考慮到HTTP的工作方式,沒有真正的好方法。 –