0

我想实现用户 A 可以向用户 B 发送消息的功能。假设用户 A 正在查看用户 B 的个人资料并单击发送消息链接,我如何确保只有用户 B 会收到消息。换句话说,在创建操作中如何捕获用户 B?我能够在新操作中捕获用户 B,但不能在创建操作中捕获。这是我到目前为止所拥有的:

class MessagesController < ApplicationController

  def new
      @message = Message.new
      @recipient = User.find_by_identifier!(params[:id])
  end

  def create
      @message = Message.new(params[:message])
      @message.recipient = @recipient
      @message.sender = current_user
      if @message.save
        flash[:notice] = "Message has been sent"
        redirect_to messages_path(:mailbox=>:sent)
      else
        render :action => :new
      end
  end
end

因此,发送消息链接传入用户 B 的参数以执行新操作。因此@recipient,在新操作中是用户 B,我能够显示用户 B 的姓名和图片。但@recipient在创建动作中为零。如何确保创建操作中的@recipient 是用户 B?

4

2 回答 2

1

控制器中的实例变量仅适用于一个请求 -在请求期间@recipient不再设置。newcreate

所以再看一遍!确保:id它仍然存在于您的 HTTP 参数中,然后执行@message.recipient = User.find(params[:id]).

于 2013-04-22T10:17:59.787 回答
1

在提交消息表单中添加一个隐藏字段,即收件人用户 ID。

在您的表格中:

<%= f.hidden_field :recipient_id, :value => @recipient.id %> 

这样,您的参数将拥有收件人,您将使用收件人信息创建新消息。

它还取决于您创建操作的路线是什么。如果您recepient_id在路线中有可用的,只需像在操作中一样再次使用它new

于 2013-04-22T10:18:10.457 回答