【问题标题】:Rendering multiple actions' results in one request on rails在 Rails 上呈现多个操作的结果是一个请求
【发布时间】:2011-09-20 14:45:40
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails layout view controller


    【解决方案1】:

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

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

    @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 并利用这种技术。一个很好的例子是用户的显示动作。

    【讨论】:

      【解决方案2】:

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

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

      这是一个例子:

      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
      
        ...
      %>
      

      通过这种方式,您可以将这些通用内容提取到控制器上的私有方法中,并且如果您需要,这些方法会自动访问参数、会话、cookie。

      【讨论】:

        猜你喜欢
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多