0

我有一个问答功能,我即将完成它。当另一个用户问他们问题时,我不知道如何执行向用户发送消息的代码。例如,用户 A 向用户 B 发送一个问题,一个收件箱消息被发送给用户 B,通知他们有一个新问题。

我认为有两种方法可以解决这个问题。

方法 #1 在消息中,它将用户链接到带有问题的页面,以便可以回答

方法#2 在消息中,它将包含被问到的问题。用户可以回复将作为他们的答案提交的消息。

问题控制器:

 respond_to :js, :html

  def index
    @questions = Question.all
    respond_with(@questions)
end


def show
  @question = Question.find(params[:id])
  @questions = Question.order("created_at DESC")
  respond_with(@questions)
end


def new
  @question = Question.new
  respond_with(@question)
end


def create
  @question = Question.new(params[:question])
  if @question.save
    redirect_to questions_path, notice: 'Your question was saved successfully. Thanks!'
  else
    render :new, alert: 'Sorry. There was a problem saving your question.'
  end
end
end

答案控制器:

  def new
    @question = Question.find(params[:question_id])
  end

  def create
    @question = Question.find(params[:question_id])
    if @question.update_attributes(params[:question])
      redirect_to questions_path
    else
      render :new
    end
  end
end

消息控制器:

 before_filter :set_user

  def index
    if params[:mailbox] == "sent"
      @messages = @user.sent_messages
    elsif params[:mailbox] == "inbox"
      @messages = @user.received_messages
    #elsif params[:mailbox] == "archived"
     # @messages = @user.archived_messages
    end
    if params[:mailbox] == "unread"
    @messages = @user.unread_messages
  end
  end

  def new
    @message = Message.new
    if params[:reply_to]
      @reply_to = User.find_by_sender_id(params[:reply_to])
      unless @reply_to.nil?
        @message.recipient_id = @reply_to.sender_id
      end
    end
  end

  def create
    @message = Message.new(params[:message])
    @message.sender_id = @user.id
    if @message.save
      flash[:notice] = "Message has been sent"
      redirect_to user_messages_path(current_user, :mailbox=>:inbox)
    else
      render :action => :new
    end
  end


  def show
     @message = Message.find(params[:id])
     @message.readingmessage if @message.recipient == current_user

 end



   def destroy
     @message = Message.find(params[:id])
     @message.destroy
     flash[:notice] = "Successfully deleted message."
     redirect_to user_messages_path(@user, @messages)
   end

  def delete_multiple
      if params[:delete]
        params[:delete].each { |id|
          @message = Message.find(id)
          @message.mark_message_deleted(@message.id,@user.id) unless @message.nil?
        }
        flash[:notice] = "Messages deleted"
      end
      redirect_to user_messages_path(@user, @messages)
  end

  private
    def set_user
      @user = current_user
  end
end

消息模型:

    attr_accessible :subject, :body, :sender_id, :recipient_id, :read_at,:sender_deleted,:recipient_deleted
    validates_presence_of :subject, :message => "Please enter message title"
    has_many :notifications, as: :event
  scope :unread, -> {where('read_at IS NULL')}
  scope :not_deleted_by_recipient, where('messages.recipient_deleted IS NULL OR messages.recipient_deleted = ?', false)
  scope :not_deleted_by_sender, where('messages.sender_deleted IS NULL OR messages.sender_deleted = ?', false)


    belongs_to :sender,
    :class_name => 'User',
    :foreign_key => 'sender_id'
    belongs_to :recipient,
    :class_name => 'User',
    :foreign_key => 'recipient_id'


    # marks a message as deleted by either the sender or the recipient, which ever the user that was passed is.
    # When both sender and recipient marks it deleted, it is destroyed.
    def mark_message_deleted(id,user_id)
         self.sender_deleted = true if self.sender_id == user_id
         self.recipient_deleted = true if self.recipient_id == user_id
         (self.sender_deleted && self.recipient_deleted) ? self.destroy : self.save!
     end
    # Read message and if it is read by recipient then mark it is read
    def readingmessage
      self.read_at ||= Time.now
      save
    end

    # Based on if a message has been read by it's recipient returns true or false.
    def read?
        self.read_at.nil? ? false : true
    end


    def self.received_by(user)
       where(:recipient_id => user.id)
     end


     def self.not_recipient_deleted
       where("recipient_deleted = ?", false)
     end

     def self.sent_by(user)
        Message.where(:sender_id => user.id)
      end

      def previous(same_recipient = true)
        collection = Message.where('id <> ? AND created_at > ?', self.id, self.created_at).order('created_at ASC')
        collection = collection.where(recipient_id: self.recipient_id) if same_recipient
        collection = collection.not_deleted_by_recipient
        collection.first
      end


      def next(same_recipient = true)
        collection = Message.where('id <> ? AND created_at < ?', self.id, self.created_at).order('created_at DESC')
        collection = collection.where(recipient_id: self.recipient_id) if same_recipient
        collection = collection.not_deleted_by_recipient
        collection.first
      end
    end

    private
    def send_notification(message)
      message.notifications.create(user: message.recipient)
    end
4

2 回答 2

2

我已经解决了这个问题。

问题控制器:

def create
  @question = Question.new(params[:question])
  if @question.save
    @message = Message.create(:subject => "Hey you have a message from #{@question.sender_id}",
                           :sender_id => @question.sender_id,
                           :recipient_id => @question.recipient_id,
                           :body => @question.question)

    @question.message = @message
    @question.save
    redirect_to questions_path, notice: 'Your question was saved successfully. Thanks!'
  else
    render :new, alert: 'Sorry. There was a problem saving your question.'
  end
end
于 2013-10-10T17:33:24.867 回答
0

每次需要通知时,您都应该创建它。它将需要一个Notification模型,该模型至少接受为其创建通知的对象、通知发送到的用户以及是否已读取它的标志。

要显示通知,最简单的方法当然是将其集成到您的布局文件中并执行以下操作:

Notification.where(:user_id => @current_user).size > 0
  <%= "You have #{Notification.where(:user_id => @current_user).size} notification(s)" %>
end

为了使事情变得更好,您可以在 Notification 对象内创建一个范围,该范围将为您提供特定用户的通知。当然,如果你想要像 Stackoverflow 那样通过 AJAX 调用更新通知的魔法,你将不得不做一些 JavaScript 提升。

于 2013-08-19T19:17:20.817 回答