在rails中创建partials路径

时间:2015-07-14 11:04:01

标签: ruby-on-rails

我正在使用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以便我保持在部分内(删除路径并不帮助)

1 个答案:

答案 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

这对你来说是否合适?