如何设置收件箱信息的上一个/下一个信息

问题描述:

我已经创建了一个收件箱信息系统,它的工作原理非常完美。但是,我不知道如何实现消息的上一个和下一个功能(以便用户在查看消息时可以转到下一个或上一个消息)。这些是在互联网上查看消息的正常功能。以前应该表示以前的消息创建时间。任何帮助,将不胜感激。如何设置收件箱信息的上一个/下一个信息

messages_controller:

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 
    if params[:mailbox] == "unread" 
    @messages = @user.unread_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.recipient_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]) 
    @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" 

    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 

    end 

show.html(消息视图):

<strong>From:</strong> 
    <%= @message.sender %> 
</p> 

<p> 
    <strong>Received:</strong> 
    <%= @message.created_at.to_s(:long) %> 
</p> 
<p> 
    <strong>To:</strong> 
    <%= @message.recipient %> 
</p> 

<p> 
    <strong>Message</strong><br /> 
    <%=h @message.body %> 
</p> 
<p> 
    <% if @message.recipient == @user %> 

    <%= link_to "Reply", new_user_message_path(@user, :reply_to => @message.sender) %> 

    | 
    <% end %> 
    <%= link_to "Inbox", user_messages_path(current_user, :mailbox=>:inbox)%> 
    | 
    <%= link_to "Delete", [current_user, @message], :confirm => 'Are you sure you want to delete this message?', :method => :delete %> 

</p> 

在消息模型:

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

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

这是我们在我们的日历系统中使用,非常有用的去上一页/下一页与Apppointments。

这依赖于updated_at列,这是一种坏(如果我更新旧邮件它会混淆下一个/上一个)。也许你想使用created_at列,或者你自己的。有了这个你可以做你的看法:

# [...] 
<p> 
    <strong>Message</strong><br /> 
    <%=h @message.body %> 
</p> 

<p> 
    <%= link_to 'Next', user_message_path(current_user, @message.next) %> 
    <%= link_to 'Previous', user_message_path(current_user, @message.previous) %> 
</p> 
+0

该模型是有道理的,虽然我将永远不能串起​​来没有更多的经验。使用日历时,您必须更新它,但使用消息时,用户无法选择在发送消息后“更新”或“修改”消息。我还在视图中获得了未定义的方法'show_user_message_path'。 – pwz2000 2013-05-08 16:53:43

+0

什么是你的url助手来显示一条消息? (你可以运行'rake routes'来列出你所有的路由和帮助器方法) – MrYoshiji 2013-05-08 20:01:20

+0

/users/:user_id/messages/:id(.:format) – pwz2000 2013-05-08 20:50:22

在您的控制器,用于在消息的观看,得到3来自DB的消息,并将中间条目显示为当前消息。将ID的前一个和下一个消息设置为变量。

然后在您的视图中制作两个按钮:上一个和下一个,他们的链接网址是您保存的ID的路径。