2013-05-07 16 views
2

我已經創建了一個收件箱信息系統,它的工作原理非常完美。但是,我不知道如何實現消息的上一個和下一個功能(以便用戶在查看消息時可以轉到下一個或上一個消息)。這些是在互聯網上查看消息的正常功能。以前應該表示以前的消息創建時間。任何幫助,將不勝感激。如何設置收件箱信息的上一個/下一個信息

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> 

回答

3

在消息模型:

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

0

在您的控制器,用於在消息的觀看,得到3來自DB的消息,並將中間條目顯示爲當前消息。將ID的前一個和下一個消息設置爲變量。

然後在您的視圖中製作兩個按鈕:上一個和下一個,他們的鏈接網址是您保存的ID的路徑。