菜单部分生成代码属于哪里

时间:2011-04-10 11:26:20

标签: ruby-on-rails model-view-controller

在我的application.html.erb布局中,我正在呈现包含以下代码的部分共享/ _menu.html.erb

<nav>
  <ul>
    <% Post.all.each do |post| %>
      <%= link_to post.title, post.permalink %>
    <% end %>
  </ul>
</nav>

从我的观点来看,我在模型上调用的事实在尊重MVC的意义上似乎是有问题的。有没有人建议如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

before_filter添加到ApplicationController:

before_filter :define_posts

def define_posts
  @posts = Post.all
end

然后你的菜单应该是这样的:

<nav>
  <ul>
    <% @posts.each do |post| %>
      <%= link_to post.title, post.permalink %>
    <% end %>
  </ul>
</nav>

另一种方法是在ApplicationController中创建辅助方法:

helper_mathod :posts

def posts
  @posts ||= Post.all
end

所以你可以直接从菜单中调用它:

<nav>
  <ul>
    <% posts.each do |post| %>
      <%= link_to post.title, post.permalink %>
    <% end %>
  </ul>
</nav>

第二种方法看起来不那么清洁。

现在的一个解决方案是使用Decent Exposure gem

  

http://railscasts.com/episodes/259-decent-exposure