Messages between users
I have body: text content: sender_id text: integer receiver_id: integer in message table
I have this in my user model:
has_many :sent_messages, :class_name => "Message", :foreign_key => "sender_id"
has_many :received_messages, :class_name => "Message", :foreign_key => "receiver_id"
I have this in my posts model:
belongs_to :sender, :class_name=>"User", :foreign_key=>"sender_id"
belongs_to :receiver, :class_name=>"User", :foreign_key=>"receiver_id"
After login, when you view another user profile (I mean this link in users view).
I am calling a new message like this:
<%= link_to "Send a Message",{:controller=>"messages",:action=>"new"}%>
I have these codes in message_controller:
def new
@message = current_user.sent_messages.build
end
def create
@message = current_user.sent_messages.build(params[:message])
if @message.save
flash[:notice] = "Successfully created message."
redirect_to root_url
else
render :action => 'new'
end
end
#.....
Also I have these codes in views \ messages \ new.html.erb
<% form_for @message do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :body %><br />
<%= f.text_field :body %>
</p>
<p>
<%= f.label :content %><br />
<%= f.text_area :content %>
</p>
<p><%= f.submit "Submit" %></p>
<% end %>
After clicking the link, I fill in the body and text and then submit. Everything is saved, but receiver_id is null. I tried many things, but I could not save receiver_id
For example: I have set the link like this:
<%= link_to "Send a Message",{:controller=>"messages",:action=>"new",
:receiver_id=>@user.id}%>
It sends the user id which I want and I can get that value with parameters, but the problem is I couldn't find a way to store this value in the database while saving others.
Lol I found that I am calling a new message like I mentioned earlier
<%= link_to "Send a Message",{:controller=>"messages",:action=>"new",
:receiver_id=>@user}%>
then the new method will be the same as in the message model
def new
@message =current_user.sent_messages.build(:receiver_id=>params[:receiver_id])
end
And the simplest thing (actual big problem for me :)) in views / messages / new.html.erb add this line to form_for
<%= f.hidden_field :receiver_id %>
try
class MessagesController
def new
@message = current_user.sent_messages.build :receiver_id => params[:receiver_id]
end
end
personally I like to use nested routes in the url like so
domain / users / 123 / posts / new
then you can do
link_to "Send a message", new_user_message( @user )
for your controller to say
class MessagesController
def new
@message = current_user.sent_messages.build :receiver_id => params[:user_id]
end
end
a source to share