2013-03-28 35 views
0

我正在處理自定義收件箱系統。當我去刪除郵件時,它會閃爍顯示該郵件被刪除的消息。不過,我仍然可以查看收件箱中的郵件並輸入網址。我如何設置一個動作,以便消息實際上永久刪除或至少在刪除文件夾中(我還沒有創建)?如何設置操作刪除收件箱郵件

消息模型:

class Message < ActiveRecord::Base 
    attr_accessible :subject, :body, :sender_id, :recepient_id, :read_at,:sender_deleted,:recepient_deleted 
    validates_presence_of :subject, :message => "Please enter message title" 

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

    # marks a message as deleted by either the sender or the recepient, which ever the user that was passed is. 
    # When both sender and recepient marks it deleted, it is destroyed. 
    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)%> 
+0

這些郵件是否從數據庫中完全刪除?你說你正在收到閃光消息。你可以通過控制器代碼嗎? –

+0

控制器添加 – pwz2000

+0

在'delete_multiple'方法中,您不會刪除數據庫中的消息,只需更新狀態。由於它們仍然存在於數據庫中,因此如果我們轉到特定的URL,就可以獲得它們的查看頁面。你需要保留它們而不刪除嗎? –

回答

1

在這裏,我們去...

一種方法是刪除來自dat的永久消息基礎,這樣他們將不會進一步可用,即使可以擊中特定的網址。

或者如果您想要軟刪除消息而不是從數據庫中永久刪除,那麼您必須在show方法中添加一個條件,以便如果消息被軟刪除,則index頁。

所以你show方法可以

 
def show 
    @message = Message.where(:id => params[:id], :deleted => false).first 
    redirect_to messages_path unless @message.present? 
end 
在上面的查詢

,我認爲deleted是可以用來告訴的天氣裏,已刪除或不現場。如果只有deleted爲假,上面的查詢將返回一條消息。

UPDATE:

檢查你的方法mark_message_deleted模型後,修改方法如下

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

這一項就足以。

+0

使用第一種方法,我得到:「Mysql2 ::錯誤:未知列'messages.deleted'在'where子句'中:SELECT'messages'。* FROM'messages' WHERE'messages'.'id' = 39 AND' messages'''deleted' = 0 LIMIT 1「。說明聲明對展會無效。如果使用更新對模型進行細微修改,則不會影響任何內容。消息在被刪除後仍然加載。 – pwz2000

+0

我在控制檯中運行了刪除功能,它對大多數選項顯示爲零。所以設置了一些措施來阻止它被刪除。上面的代碼是正確的,還有一些我不知道是阻止:DELETE FROM'messages' WHERE'messages'.'id' = 44 =># pwz2000