Im using the mailboxer gem to build a private messaging system.

I want to loop over my user list, and next to each users name, provide a link to open a preexisting conversation if it exists, or create a new one if no conversation does exist. (So users would only be able to have 1 conversation with another user, rather than an email like system).

<% @users.each do |u| %>
  <%= link_to u.name, u %>
  <% @mailbox.conversations.each do |c| %>
    <% if c.receipts.where(:receiver_id => user).present? %>
     true
    <% else %>
     false
    <% end %>
  <% end %>
<% end %>

so "true" would be the link to reopen the conversation and "false" would be a button for a new conversation.

but if a user has 4 conversations and 1 with a given user, it would return true false false false. so 1 continue button and 3 create new. so essentially, i need the entire thing to return either true or false

有帮助吗?

解决方案

if anyone is interested, this is a more elegant solution. just in the controller. then all links are the same, and it will open message if it exists. filtering by Conversation.participant(a).participant(b) was the key

def new
  @recipient = User.find(params[:recipient])
  @ongoing_conversation = Conversation.participant(current_user).participant(@recipient)

  respond_to do |format|
    format.html { redirect_to root_path }
    if @ongoing_conversation.present?
      format.js { redirect_to mailbox.conversations.find(@ongoing_conversation) }
    else
      format.js
    end
  end
end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top