2011-06-22 72 views
0

我正在使用Ruby on Rails,并试图加载由多个子页面组成的页面。每个子页面都非常不同,每个子页面的数据都是由控制器中的单独操作生成的。在加载主页面时,我想通过调用相应的动作来加载子页面的内容。在rails上的一个请求中呈现多个操作的结果

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

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

谢谢!

回答

0

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

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

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

在你看来,你然后用谐音来呈现你的网站

<%= 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并利用这种技术。一个很好的例子是用户的表演动作。

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 

    ... 
%> 

通过这种方式,你可以提取那些共用的东西出来要控制器私有方法,如果你需要他们这些方法自动访问参数,可以会话,饼干。

相关问题