Rails从视图调用操作

时间:2011-02-17 16:49:18

标签: ruby ruby-on-rails-3 action partial-views render

希望这里有一个简单的问题,但我不能为我的生活似乎找到答案。刚开始使用RoR,但之前来自ASP MVC。我有一个问题渲染部分视图,其局部变量不一定与主视图的变量相关联。例如,通过博客,我试图呈现一个链接到存档的侧边栏。

def sidebar
  @blog_posts = Blog.all(:select => "created_at")
  @post_months = @blog_posts.group_by { |m| m.created_at.beginning_of_month }
end

部分视图_sidebar如下:

<div class="archives">
  <h4>Blog Archive</h4>
    <% @post_months.sort.reverse.each do |month, posts| %>
    <%= link_to "#{h month.strftime("%B %Y")}: #{posts.count}", archive_path(:timeframe => month) %>
<% end %>
</div>

我遇到的问题是,如果我只是在主视图中执行渲染“侧边栏”,则似乎不会调用该操作,并且@post_months始终为nil。是否可以直接从视图中调用操作并简单地将该渲染设置为“侧边栏”?在ASP MVC中,我曾经只是从侧视图中将侧边栏设置为ChildActionOnly和Render.Action,但在RoR中我完全无能为力。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

我认为这里发生的事情是你的侧边栏被视为部分,你的控制器方法永远不会被调用。在这种情况下,我将当前包含在侧边栏控制器方法中的代码放入ApplicationHelper模块或当前视图的辅助模块中,具体取决于您是否需要从其他视图渲染侧边栏。

您需要稍微调整代码才能在模块中工作。您应该让方法返回您想要的值,而不是设置会话变量。

Module SomeModule
  def blog_posts
    Blog.all :select => "created_at"
  end

  def post_months
    blog_posts.group_by { |m| m.created_at.beginning_of_month }
  end
end

当然,这很可能需要重构,并且可能无法按照书面形式运作,但这是我要采用的一般想法。

祝你好运。