【问题标题】:How do I use sub-controllers in Ruby on Rails?如何在 Ruby on Rails 中使用子控制器?
【发布时间】:2023-04-01 04:23:01
【问题描述】:

我正在学习 RoR,并且我正在尝试解决一个一般性的设计问题。我想就答案获得一些意见,以确保我遵循某种最佳做法。

我有一个由 3 个子部分组成的页面,我们称它们为 A、B 和 C。某些操作会导致其中的每一个都通过 AJAX 刷新,所以我希望它们每个都有一个控制器操作,允许任何它们单独呈现,没有页面镶边。

我现在的结构是使用一个控制器,它有 4 个动作:索引、A、B、C

A、B 和 C 中的每一个都使用 layout=>false 渲染其视图,因此我可以在需要时通过 AJAX 渲染该部分。然后,你有索引,它会渲染一些额外的东西以及 A、B 和 C 的视图。

基本上我想要的是 3 个子控制器,以及一个根据需要调用子控制器的主控制器。或者我认为这就是我想要的。我认为我不想要的是部分视图,因为我在控制器中为 A、B、C 中的每一个都做了一些设置,然后我必须在索引控制器和控制器中复制设置代码A、B、C。

我想到的代码是这样的:

my_controller.rb:

class MyController < ApplicationController
    def index
         @aOutput = A
         @bOutput = B
         @cOutput = C
         render //can use @aOutput, @bOutput, @cOutput in the view
    end

    def A
        render :layout => false    
    end

    def B
        render :layout => false
    end

    def C
        render :layout => false
    end
end

这将使我现在可以在我想要整个页面时访问 MyController#index,当我想要重新呈现每个小节的内容时访问 MyController#A 等。

这里的问题是,如果代码是这样的结构,访问 MyController#index 时会遇到 DoubleRender 错误。处理这种事情的正确方法是什么?随意破坏我在这里所做的任何假设,唯一的要求是页面具有三个部分,可以根据需要单独更新,而无需重新加载整个页面。

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller design-patterns


    【解决方案1】:

    我不确定我是否清楚地理解了这个问题,但我认为这就是我认为你的问题所在。

    • 您希望能够只渲染一个视图而不调用整个控制器操作。

      这可以通过使用render :action =&gt; :action_name来完成

    • 您只想为 ajax 调用呈现一些文本

      使用respond_to 块来实现这一点。例如。

      def whatever_action
      
        .... # Your action voodoo here
      
        respond_to do |format|
          format.html { ... } # If it a normal HTTP request
          format.js {...} # If it's an ajax or JSON request
        end
      end       
      

    您提出的设计存在基本缺陷,例如不遵守某些 SOLID 设计原则。我强烈推荐阅读一本关于 Rails 基础知识的好书。

    【讨论】:

    • 这个答案不是很有帮助。这是一个常见的设计:在页面中有一些特定的 HTML 块,可以根据需要通过 AJAX 替换。我想每个可替换的部分都对应一个 Rails 动作,整个页面也是如此。我只是不知道如何正确地将这些部分组合在一起。如果这是偏离或违反某些设计原则,我很想知道如何。只是随机静态它违反了某些首字母缩写词并告诉我读一本书根本没有用。如果我想读一本书,我不会在这里问。
    • 所以你宁愿在stackoverflow上提问因为你不想看书?只需谷歌搜索"SOLID design Principles" 就会在第一个结果中为您带来足够的信息,让您理解我的意思。但看起来你甚至不想这样做。
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多