Rails:在单个页面上渲染多个index.html.erb

时间:2010-07-03 11:06:37

标签: ruby-on-rails

我正在使用标签,并希望将多个索引页加载到标签中。例如:

class AnimalsController < ApplicationController
  def index
    @dogs = Dog.all
    @cats = Cat.all
  end
end

然后在我的观点/ animals / index.html.erb

<ul class="tabs">
  <li>Dogs</li>
  <li>Cats</li>
</ul>
<div id="#dogs">
  <%= render @dogs %>
</div>
<div id="#cats">
  <%= render @cats %>
</div>

重构是否是实现这一目标的唯一途径?

我想立即静态加载它们,而不必在单击选项卡时使用Ajax.load()。

2 个答案:

答案 0 :(得分:3)

你在问题​​中有答案。为什么不使用javascript隐藏两个部分并在单击其各自的选项卡时调用它们?你根本不需要ajax:)

由于您没有提及您使用的javascript库,我将使用jquery提供一个通用的解决方案:

此外,您无需在各自的div中添加#。将其更改为:

<ul class="tabs">
  <li id="dogs">Dogs</li>
  <li id="cats">Cats</li>
</ul>
<div id="dogs" class="subTabs">
  <%= render @dogs %><hr />
</div>
<div id="cats" class="subTabs">
  <%= render @cats %><hr />
</div>


$(document).ready(function() {
    $('.subTabs').hide(); //Hide the subTabs as soon as the DOM is loaded.

    $('li').live('click', function(e) {
        $('.subTabs').hide(); //Calling this again so as to remove an already loaded
                                tab, if any. You can refactor this part to make it
                                even simpler.
        $('body').find('.subTabs').attr('id',$(this).attr('id')).show();
             //This finds the ".subTabs" whose id is the same as the "li" id that
               was clicked and shows it. Ofcourse, even this can be made even more
               compact had i known your entire DOM structure.     
    });
});

修改 您还必须确保使用CSS对其进行样式设置,使其看起来更像是制表符(如果您还没有)。 :)

希望这会有所帮助。 :)

答案 1 :(得分:1)

如果您在多个地方使用相同或几乎相同的代码,通常只想使用部分代码。

当你说“索引页面”时,你真的想要使用在另一个控制器的索引中使用的相同代码吗?如果是这样,那么部分是最好的策略。

不要使用JavaScript来解决布局/代码组织问题。