Rails控制器if else语句

时间:2014-09-23 05:47:39

标签: ruby-on-rails if-statement messages

我正在使用我的rails web应用程序中的消息传递系统,这应该让用户能够查看他们发送和接收的消息。已发送和已接收的消息在我的模型中定义为“to_messages”和“from_messages”。就目前而言,我能够为收件箱和发件箱显示相应的消息。当用户进入收件箱并单击收到的消息时,show动作将显示内容。但是,这不适用于发件箱中发送的邮件。当用户点击发件箱中发送的消息时,我收到一个错误,我怀疑我得到了错误,因为在我的消息控制器中,我只调用to_messages(收到的消息)。我知道我的控制器需要一个if / else语句,但我不知道如何写出来。对新手问题道歉,但有没有人有任何想法?谢谢!

messages_controller.rb

class MessagesController < ApplicationController

  def index
    @messages = current_user.to_messages
  end

  def outbox
    type = (params[:type] && params[:type] == "sent" ) ? "from_messages" : "to_messages"
    @messages = current_user.from_messages
  end

  def show
    @message = current_user.to_messages.find params[:id]
  end

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

  def create
    @message = Message.new message_params
    @message.sender_id = current_user.id
    if @message.save
      flash[:success] = "Your message has been sent!"
      redirect_to users_path
    else
      flash[:failure] = "Please try again."
      redirect_to users_path
    end
  end

  def destroy
    @message = Message.find(params[:id])
    @message.destroy
    redirect_to messages_path
  end

  private

  def message_params
    params.require(:message).permit(:content, :sender_id, :recipient_id)
  end

end

2 个答案:

答案 0 :(得分:1)

您的发件箱消息的方法似乎试图处理&#39; from_messages&#39;和&#39; to_messages&#39;但随后对信息一无所知:

def outbox
  type = (params[:type] && params[:type] == "sent" ) ? "from_messages" : "to_messages"
  @messages = current_user.from_messages
end

一旦你有了类型(from_messages或to_messages),你就可以做到:

def outbox
  type = (params[:type] && params[:type] == "sent" ) ? "from_messages" : "to_messages"
  @messages = current_user.send(type.to_sym)
end

你的节目&#39;行动似乎也不是在处理from_messages。可能有必要在那里发送类型:

def show
   type = (params[:type] && params[:type] == "sent" ) ? "from_messages" : "to_messages"       
   @message = current_user.send(type.to_sym).find params[:id]
end

这是一个干燥的解决方案:

class MessagesController < ApplicationController

  before_action :find_type, only: [:outbox, :show]

  def index
    @messages = current_user.to_messages
  end

  def outbox
    @messages = current_user.send(@type.to_sym)
  end

  def show
    @message = current_user.send(@type.to_sym).find params[:id]
  end

  ...
  Rest of controller
  ...

private

  def find_type
    @type = (params[:type] && params[:type] == "sent" ) ? "from_messages" : "to_messages"
  end

end

答案 1 :(得分:0)

我实际上已经明白了。 AllI必须做的是将我的Messages#show action中的代码更改为以下内容:

def show
  @message = Message.find params[:id]
end

无论如何,谢谢你的帮助。