Rails从视图中调用操作

3

希望这里只有一个简单的问题,但是我似乎找不到答案。刚开始使用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>

我遇到的问题是,如果我在主视图中简单地进行render 'sidebar'操作,该操作似乎并没有被调用,@post_months始终为nil。是否可以直接从视图中调用该操作,并简单地进行render 'sidebar'操作?在ASP MVC中,我曾经将侧边栏设为ChildActionOnly,并从主视图中进行Render.Action操作,但在RoR中,我完全不知道该怎么做。任何帮助都将不胜感激!

好问题,我自己也一直在思考这个问题,来自Symfony背景,除了部分视图之外,还有组件(这些是带有控制器代码支持的部分视图)。 - matei
1个回答

1

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

你需要稍微修改一下代码才能在模块中运行。你应该让方法返回你想要的值,而不是设置一个session变量。

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

当然,那可能需要重构并且可能不能按照原来的方式工作,但这是我会采用的一般想法。

祝你好运。


感谢您的回复,解决了我的问题。在ASP MVC中更容易实现,但我认为这是一种更“清晰”的MVC解决方案。 - Will Ayd
这里有一篇文章,总结了这个问题:http://andyjeffries.co.uk/articles/developing-components-considered-bad-form-in-rails - matei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接