2013-09-18 3 views
1

У меня есть обычная почтовая система обмена сообщениями, и я хотел бы исправить функцию удаления сообщений. В тот момент, когда Пользователь A удаляет сообщение, он не будет окончательно удален из базы данных, пока Пользователь B также не удалит это сообщение. Таким образом, сообщение останется в папке «Входящие»/«Удалить» пользователей, пока оба отправителя и получателя не удалит это сообщение.Как скрыть удаленное сообщение от получателя с почтовыми ящиками

Как бы я хотел, чтобы функция функционировала так: если один пользователь удаляет сообщение из своего почтового ящика или снова нажимает кнопку удаления для сообщений внутри их папки удаления ... сообщение должно оставаться скрытым, как если бы оно было удалено. Таким образом, это сообщение не отображается пользователю, который выбрал его для удаления. Затем, конечно, с тем, как я его уже установил, сообщение будет окончательно удалено из базы данных, если оба пользователя выбрали его для удаления.

Когда сообщение мягко удалено (скрыто от одного пользователя до тех пор, пока оно не будет окончательно удалено из базы данных), он не должен быть доступен этому пользователю. Если они просматривают свои сообщения и используют следующие/предыдущие ссылки ... сообщения, которые они удалили, не должны появляться при нажатии следующей/предыдущей.

Любая помощь будет оценена!

сообщений контроллер:

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 

Сообщение модель: вид

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.where(recipient_id: self.recipient_id) if same_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.where(recipient_id: self.recipient_id) if same_recipient 
    collection.first 
    end 
end 

Входящий:

<%= form_tag delete_multiple_user_messages_path, :method=>:post do %> 
    <table class="table table-bordered"> 
      <tr> 
      <th>Delete</th> 
      <th>Subject</th> 
      <th>Date</th> 
      <th>From</th> 
     </tr> 
      <% for message in @messages %> 
       <tr> 
        <td><%= check_box_tag "delete[]", message.id %></td><p> 

        <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> 
      <td><%= "#{message.sender}" %></td> 
       </tr> 
    <% end %> 
    </table> 
<%= submit_tag "Delete selected" %> 
+1

Обнаружена также опечатка: '#elsif params [: mailbox] ==" archieved "'; '# @messages = @ user.archived_messages' – grandinero

ответ

1

Я вижу этот метод в вашей модели, но я не вижу, ты звонишь в любом месте:

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

Я считаю, что если вы измените этот цикл в окне Входящих

<% for message in @messages %> 

в

<% for message in @messages.not_recipient_deleted %> 

он будет возвращать только те сообщения, которые получатель не удаляются. Это должно привести к тому, что удаленные сообщения будут отображаться в папке «Входящие».

+0

А я пропущу это! Легко 50 очков за вас. Большое спасибо! –

+2

* изменение сообщений в единственном числе. 'для сообщения' – pwz2000

0

вы можете использовать этот контроллер для индекса действия @messages = @ user.received_messages.where (recipient_deleted ложь)

так она будет загружать только те сообщения, которые не удаляются получателем

Смежные вопросы