渲染多个操作会导致一个请求在rails上

时间:2011-06-22 17:47:40

标签: ruby-on-rails layout view controller

我正在使用Ruby on Rails并且正在尝试加载包含许多子页面的页面。每个子页面都非常不同,每个子页面的数据都是由控制器中的单独操作生成的。在加载主页面时,我还想通过调用相应的操作来加载子页面的内容。

所以我的问题是,是否可以在单个页面请求时触发对不同操作的多个请求。如果是这样,实现此目的的最佳方法是什么,以便每个操作的结果视图显示在页面的正确部分?如果不可能,我还可以在单​​个请求中加载从不同操作处理的内容吗?

理想情况下,可以从不同的地方调用子页面的动作(例如,子页面可以是不同页面的组件,也可以是其自己的页面)。我想抽象出从控制器调用动作的位置,这样我就可以简单地为控制器生成的数据渲染适当的部分。但关键是这部分不会在控制器中确定,而是在视图中确定。这样的事情已经完成了吗?还有更好的选择吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我不知道你想要什么。但绝对不能将视图作为当前操作的一部分呈现其他操作。

但是,您可以在控制器上编写私有方法来设置变量,并在视图文件中包含相应的公共部分。

这是一个例子:

class UsersController < ...
  def show
    @user = current_user

    setup_user_friends_widget(@user)
  end

  private

  def setup_user_friends_widget(for_who)
    @use_user_friends_widget= true

    @friends = for_who.friends
  end
end

# in your view users/show.html.erb

<%- if @use_users_friend_widget %>
  <%= render :partial => "shared/widgets/user_friends"
<%- end %>

# in shared/widgets/_user_friends

<%- @friends.each do |friend| %>
  # use the instance variables directly because you have to call the setup_user_friends_widget method before you could use this widget.
  # so you are safe to use the instance variables instead of passing them from render :partial

  ...
%>

通过这种方式,您可以将这些常用内容提取到控制器上的私有方法中,如果需要,这些方法可以自动访问params,sessions和cookie。

答案 1 :(得分:0)

不应该通过调用不同的动作来解决你想要做的事情。

在控制器中,您知道要在视图中显示哪些模型,因此您可以相应地设置属性,例如

@user = current_user
@team = current_user.team.first
@top_teams = Team.top5 # this is a scope returning the 5 top teams

在您的视图中,您可以使用partials来渲染网站的不同部分

<%= render "users/parts/box", :user => @user %>
<%= render "teams/parts/detail", :team => @team %>
<%= render "teams/parts/top", :collection => @top_teams %>

我建议您查看Opensourcerails, which itself is open source并使用此技巧。一个很好的例子就是用户的节目动作。