Rails 从视图中调用操作

Posted

技术标签:

【中文标题】Rails 从视图中调用操作【英文标题】:Rails calling action from view 【发布时间】:2011-06-29 05:58:43 【问题描述】:

希望在这里有一个简单的问题,但我似乎一辈子都找不到答案。刚开始使用 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 始终为零。是否可以直接从视图中调用操作并简单地渲染“侧边栏”?在 ASP MVC 中,我曾经只是将侧边栏设置为 ChildActionOnly 和主视图中的 Render.Action,但在 RoR 中,我完全一无所知。任何帮助表示赞赏!

【问题讨论】:

好问题,我自己也一直想知道这个问题,来自 symfony 背景,除了部分,还有组件(它们是带有支持它们的控制器代码的部分视图) 【参考方案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

当然,这很可能需要重构,并且可能无法按所写的那样工作,但这是我的总体思路。

祝你好运。

【讨论】:

感谢您的回复。在 ASP MVC 中更容易做,但我想这是一个“更干净”的 MVC 解决方案。 这里有一个article 总结了这一点

以上是关于Rails 从视图中调用操作的主要内容,如果未能解决你的问题,请参考以下文章

从rails视图文件中的脚本调用js文件中的函数

从 Rails 中的其他控制器调用方法

如何在 Ruby on Rails 的控制台中调用控制器/视图辅助方法?

rails如何从命令行调用运行本地服务器的控制器操作[重复]

如何在视图中设置和调用 rails 方法来更新对象的属性

Ruby on Rails:将数据调用到 javascript 中的首选方法?