Framework: Rails 3/ Jruby with Mailboxer gem.
I want to create a Facebook style inbox page that allows a user to scroll through their Inbox, Sent Items and Trash, whilst keeping the selected conversation displayed on the right hand side of the page (like Facebook's implementation of the desktop inbox)
The action of clicking the conversation title should render that entire conversation to the right side of the page, avoiding the need of dedicating an entire page to one conversation within the web browser. This is so (in a later version) I can implement an AJAX call that will only refresh the conversation part of the page, whilst allowing the user to keep an eye on their conversation list.
My problem is, I'm completely stumped as to how this would be implemented, without the routing error No route matches [GET] "/conversations/20/show_conversation"
that I'm currently getting. I'm fairly new to Ruby on Rails, so the whole routing side of things is a bit confusing.
My question how do I display all my conversations, as well as the transcript of one selected conversation (at any given time) on the same page. Preferably, I would like to avoid the use of Javascript/ jQuery and stick to the Ruby on Rails implementation, if possible.
Here's a screenshot of my "messages" page, where "Conversation.." (on the right) should display the transcript of the conversation I had with the target user.
My controller code for the current page:
class ConversationsController < ApplicationController
before_filter :authenticate_user!
before_filter :get_mailbox
before_filter :get_conversation, except: [:index]
before_filter :get_box, only: [:index]
before_filter :get_conversation, except: [:index, :empty_trash]
def index
@conversations = @mailbox.inbox.paginate(page: params[:page], per_page: 10)
@inbox = @mailbox.inbox.paginate(page: params[:page], per_page: 10)
@trash = @mailbox.trash.paginate(page: params[:page], per_page: 10)
@sent = @mailbox.sentbox.paginate(page: params[:page], per_page: 10)
end
def show_conversation
@conversation
redirect_to conversations_path
end
[...]
private
def get_mailbox
@mailbox ||= current_user.mailbox
end
def get_conversation
@conversation ||= @mailbox.conversations.find(params[:id])
end
def get_box
if params[:box].blank? or !["inbox","sent","trash"].include?(params[:box])
params[:box] = 'inbox'
end
@box = params[:box]
end
end
My corresponding views: index.html.erb
<% page_header "Your Conversations" %>
<p><%= link_to 'Start conversation', new_message_path, class: 'btn btn-lg btn-primary' %>
<%= link_to 'Empty trash', empty_trash_conversations_path, class: 'btn btn-danger',
method: :delete, data: {confirm: 'Are you sure?'} %></p>
<!-- tab things, they're awesome -->
<div class="left_col">
<div class="col-sm-3">
<ul class="nav nav-pills">
<%= mailbox_section 'inbox', @box %>
<%= mailbox_section 'sent', @box %>
<%= mailbox_section 'trash', @box %>
</ul>
</div>
<!-- this working part isn't in the tutorial -->
<% if @box == 'trash' %>
<%= render partial: 'conversations/conversation', collection: @trash %>
<% elsif @box == 'inbox' %>
<%= render partial: 'conversations/conversation', collection: @inbox %>
<% elsif @box == 'sent' %>
<%= render partial: 'conversations/conversation', collection: @sent %>
<% end %>
<%= will_paginate %>
</div>
<div class="right_col">
<p><small>Conversation...</small></p>
<%= @conversation %> <!-- should I have a partial or something? -->
</div>
_conversation.html.erb partial where the link to show_conversation is
<%= link_to conversation.subject, show_conversation_conversation_path(conversation) %>
<div class="btn-group-vertical pull-right">
<% if conversation.is_trashed?(current_user) %>
<%= link_to 'Restore', restore_conversation_path(conversation),
class: 'btn btn-xs btn-info', method: :post %>
<% else %>
<%= link_to 'Move to trash', conversation_path(conversation),
class: 'btn btn-xs btn-danger', method: :delete,
data: {confirm: 'Are you sure?'} %>
<% if conversation.is_unread?(current_user) %>
<%= link_to 'Mark as read', mark_as_read_conversation_path(conversation),
class: 'btn btn-xs btn-info', method: :post %>
<% end %>
<% end %>
</div>
<p><%= render 'conversations/participants', conversation: conversation %></p>
<p><%= conversation.last_message.body %>
<small>(<span class="text-muted">
<%= conversation.last_message.created_at.strftime("%-d %B %Y, %H:%M:%S") %>
</span>)</small></p>
And finally, my routes.rb
resources :conversations, only: [:index, :show, :destroy] do
member do
post :reply, :restore, :mark_as_read, :show_conversation
end
collection do
delete :empty_trash
end
end
resources :messages, only: [:new, :create]
root :to => 'conversations#index'
I do have a working conversation partial that builds the conversation on a separate page. It works fine, but I haven't included it because I want to move away from having a separate page to view the conversation. Any help on this would be greatly appreciated!
Thanks,
Aucun commentaire:
Enregistrer un commentaire