У меня есть обычная почтовая система обмена сообщениями, и я хотел бы исправить функцию удаления сообщений. В тот момент, когда Пользователь 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" %>
Обнаружена также опечатка: '#elsif params [: mailbox] ==" archieved "'; '# @messages = @ user.archived_messages' – grandinero