Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在带有Rails的控制器帮助器中保持实例变量干燥?_Ruby On Rails_Filter_Module_Dry - Fatal编程技术网

Ruby on rails 如何在带有Rails的控制器帮助器中保持实例变量干燥?

Ruby on rails 如何在带有Rails的控制器帮助器中保持实例变量干燥?,ruby-on-rails,filter,module,dry,Ruby On Rails,Filter,Module,Dry,我正在编写这个小部件,它将包含在站点的单个页面中,因此我不认为有理由声明我在ApplicationController中所做的事情。然而,这个新的小部件确实有相当多的复杂性,所以我想将它与通常处理此页面的控制器分开,因为该控制器已经有相当多的复杂性。我最初认为在我的设计中,我可以为控制器制作一个助手模块,并将大部分小部件逻辑保留在那里 我试图编写这个帮助器模块,但后来我意识到有一个特定的数组我需要能够从一个位置初始化,但是多个方法需要访问它,并且需要确保在任何其他方法调用此数组之前初始化它。在这

我正在编写这个小部件,它将包含在站点的单个页面中,因此我不认为有理由声明我在ApplicationController中所做的事情。然而,这个新的小部件确实有相当多的复杂性,所以我想将它与通常处理此页面的控制器分开,因为该控制器已经有相当多的复杂性。我最初认为在我的设计中,我可以为控制器制作一个助手模块,并将大部分小部件逻辑保留在那里


我试图编写这个帮助器模块,但后来我意识到有一个特定的数组我需要能够从一个位置初始化,但是多个方法需要访问它,并且需要确保在任何其他方法调用此数组之前初始化它。在这样一个模块中,是否有一种类似于before_过滤器的方法,我可以确保该变量在使用前初始化,或者是否有一种更好的整体方法,即“Rails方法”?

我认为您可以创建一个新类,并在before_过滤器或控制器中实例化它。 不确定您想要实现什么,但可以举一个例子:

class MyArrayBuilder
  def initialize(some, param)
    #something
  end

  def get_array
    return my_array
  end
end

class SomethingsController < ApplicationController

  before_filter :build_array

  def build_array
    @array = MyArrayBuilder.new(some, param).get_array
  end
end
类MyArrayBuilder
def初始化(部分,参数)
#某物
结束
def get_阵列
返回我的数组
结束
结束
类SomethingsController
然后将
@array
变量传递给助手


我不确定是否有一种“Rails方式”可以满足您的需求:Rails是一种惯例,但当您开始非常关心设计和开发时,我认为最好考虑面向对象编程的良好实践,而不是Rails惯例。

您可能需要一个好的演示者。在里面找

演示者是控制器和视图之间的中间地带。它可以访问数据,并处理复杂的逻辑,这与表示有关,而与数据操作无关。它可以做很多简单明了的事情。看看吧,也许这对你的问题有好处


.

您的意思是在与控制器相同的文件中定义一个类,或者在其他地方定义它,然后让控制器在初始化之前进行筛选?如果没有在控制器文件中定义(这是我使用“Rails方式”的地方),它应该在Rails根目录中定义在哪里?如果您只在控制器中需要它,我会在控制器文件中定义它,如果您要在其他地方重用它,我会把它放在
lib
app/models
目录中。在
models
文件夹中有一种常见的方法,即“仅将模型链接到数据库中的表”,但对我来说,这不是“正确”的行为,如果您可以添加一个类作为域对象的“第一公民”,它应该存在于模型中。所以这个网站的奇怪之处在于,模型是通过服务调用动态生成的,所以根本没有使用ActiveRecord。另外,我之所以考虑将逻辑与控制器分离,是因为这远远不是该页面上唯一的小部件,控制器中的逻辑变得非常。。。好。。。需要重构,我想知道我应该怎么做。我想你可以用我在回答中说的话。您可以创建新类,这样就不会再弄乱控制器代码。如果您认为您将添加更多此类类来构建小部件,那么您最终可以添加一个目录
app/widgets
,并将您的类放入其中。当您遇到这种复杂程度时,没有Rails方式/惯例,这取决于您定义您的体系结构。要理解我所说的遵循Rails面向对象编程的良好实践的意思,您可以阅读Avdi,其中有很多好东西!