我正在使用mailboxer gem来允许在我的应用上发送消息。
我希望页面显示收件箱,已发送,垃圾邮件显示在我的单个页面上,而不是使用必须转到另一个页面才能看到此内容。
为了做到这一点,我设置了如下部分:
的index.html
<%= render :partial => 'conversations/index', :locals => {:box => @box } %>
工作正常,我看到收件箱,发送和垃圾链接。
然而,当我点击收件箱时,它会带我到另一个带有收件箱,发送和垃圾箱的页面。这是原始的对话/ index.html.erb(与_index相对)。原因是因为_index代码如下:
<div class="row">
<div class="col-sm-3">
<ul class="nav nav-pills nav-stacked">
<%= mailbox_section 'inbox', @box %>
<%= mailbox_section 'sent', @box %>
<%= mailbox_section 'trash', @box %>
</ul>
</div>
<div class="col-sm-9">
<ul class="list-group">
<%= render partial: 'conversations/conversation', collection: @conversations %>
</ul>
</div>
</div>
mailbox_section是一个名为conversations_helper.rb的帮助程序中定义的方法,如下所示:
module ConversationsHelper
def mailbox_section(title, current_box, opts = {})
opts[:class] = opts.fetch(:class, '')
opts[:class] += ' active' if title.downcase == current_box
content_tag :li, link_to(title.capitalize, conversations_path(box: title.downcase)), opts
end
end
是conversations_path带我回到对话/ index.html,而不是让我留在部分。
所以问题是,如何更改conversations_path以便我保持在部分内(删除路径并不帮助)
答案 0 :(得分:0)
有一种方法可以通过异步加载框的渲染部分(你需要jQuery)来做你想要的(我认为)。
在您的HTML中,
<div class="row">
<div class="col-sm-3">
<ul id="section-selector" class="nav nav-pills nav-stacked">
<%= mailbox_section 'inbox', @box %>
<%= mailbox_section 'sent', @box %>
<%= mailbox_section 'trash', @box %>
</ul>
</div>
<div class="col-sm-9">
<ul id="conversations" class="list-group">
<%= render partial: 'conversations/conversation', collection: @conversations %>
</ul>
</div>
</div>
<script type="text/javascript">
// detect click on your mailbox links
('#section-selector li').click(function() {
// extract the box type
var box = $(this).data('box');
// ask the server for the rendered partial of this box
$.ajax({
url: "/conversations/" + box,
cache: false,
success: function(html){
// change the content of the conversations ul with the new rendered
// partial
$("#conversations").html(html);
}
});
});
</script>
在您的控制器中:
def show
@conversations = Conversation.where(box: params[:box]) # or whatever your do
render partial: 'conversations/conversation', collection: @conversations
end
在你的助手:
module ConversationsHelper
def mailbox_section(title, current_box, opts = {})
opts[:class] = opts.fetch(:class, '')
opts[:class] += ' active' if title.downcase == current_box
opts[:data] = {box: title.downcase} # add the box type to your link
content_tag :li, link_to(title.capitalize, '#'), opts
end
end
这对你来说是否合适?