如何更改收件箱邮件标记从未读到读取

时间:2013-04-03 15:58:07

标签: ruby-on-rails

我正在构建一个收件箱邮件系统。当大多数消息被标记为“已读”时,我的所有消息都显示为未读。我将它设置在我的消息模型中以检查是否未读或已阅读。所以我不明白为什么代码不能用于未读/读。

message.rb:

belongs_to :sender,
    :class_name => 'User',
    :foreign_key => 'sender_id'
belongs_to :recepient,
    :class_name => 'User',
    :foreign_key => 'recepient_id'

    def mark_message_deleted(id,user_id)
        self.sender_deleted = true if self.sender_id == user_id and self.id=id
        self.recepient_deleted = true if self.recepient_id == user_id and self.id=id
        self.sender_deleted && self.recepient_deleted ? self.destroy : save!
    end

    # Read message and if it is read by recepient then mark it is read
    def self.readingmessage(id, reader)
        message = find(id, :conditions => ["sender_id = ? OR recepient_id = ?", reader, reader])
        if message.read_at.nil? && (message.recepient.user_id==reader)
            message.read_at = Time.now
            message.save!
        end
        message
    end

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

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

     def self.not_recepient_deleted
       where("recepient_deleted = ?", false)
     end

end

消息控制器:

class MessagesController < ApplicationController

  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] == "archieved"
     # @messages = @user.archived_messages
    end
  end

  def new
    @message = Message.new
    if params[:reply_to]
      @reply_to = User.find_by_user_id(params[:reply_to])
      unless @reply_to.nil?
        @message.recepient_id = @reply_to.user_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])
  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

索引视图:

<h2>Your Inbox</h2>
<% if @messages.size == 0 %>
No messages in your Inbox
<% end %>
<% else %>
        <%= form_tag delete_multiple_user_messages_path, :method=>:post do %>
            <table  class="table table-bordered">
                    <tr>
                    <th>Delete?</th>
                    <th>Sent</th>
                    <th>Sender</th>
                    <th>Sent</th>
                </tr>
                    <% for message in @messages %>
                        <tr>
                            <td><%= check_box_tag "delete[]", message.id %></td>
                            <td>
                                <% if message.read? %>
                                  <%= link_to h(message.subject), user_message_path(@user, message) %>
                                <% else %>
                                  <%= link_to "#{h(message.subject)} (unread)", user_message_path(@user, message) %>
                                <% end %>
                            </td>

                            <td><%=h message.created_at.to_s(:long) %></td>
                        </tr>
            <% end %>
            </table>
        <%= submit_tag "Delete selected" %> |
        <% end %>
<%= link_to "Compose New Message", new_user_message_path(@user)%> | 
<%= link_to "View Sent Messages", user_messages_path(current_user, :mailbox => :sent)%>

2 个答案:

答案 0 :(得分:5)

您的消息全部显示为未读,因为read_at字段永远不会从nil更改。

看起来您的readingmessage方法应该更改值,但它永远不会被调用。

(在控制器的show方法中调用它是有意义的。)

型号:

def readingmessage
  self.read_at ||= Time.now
  save
end

控制器:

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

答案 1 :(得分:0)

这种方法做得太多了:

# Read message and if it is read by recepient then mark it is read
def self.readingmessage(id, reader)
    message = find(id, :conditions => ["sender_id = ? OR recepient_id = ?", reader, reader])
    if message.read_at.nil? && (message.recepient.user_id==reader)
        message.read_at = Time.now
        message.save!
    end
    message
end

我不明白为什么你在发件人阅读邮件时调用这种方法,但如果这就是你所需要的,我会选择以下内容:

# Read message and if it is read by recepient then mark it is read
def self.readingmessage(id, reader)
    message = find(id, :conditions => ["sender_id = ? OR recepient_id = ?", reader, reader])
    message
end

def self.mark_read(id, reader)
      # Read message and if it is read by recepient then mark it is read
    def self.readingmessage(id, reader)
        message = find(id, :conditions => [recepient_id = ? and not null read_at", reader])
        if message
            message.read_at = Time.now
            message.save!
        end
        message
    end
end

我假设您的控制器/视图知道收件人何时正在阅读邮件以及相关邮件的ID,在这种情况下mark_read可以大大简化