在Ruby on Rails中的控制器之间重用代码的最佳实践

时间:2020-03-06 14:40:33  来源:igfitidea点击:

我想分享一些控制器方法。在轨道上的红宝石中执行此操作的最佳实践是什么?我应该创建控制器扩展的抽象类,还是应该创建模块并将其添加到每个控制器中?以下是我要分享的控制器方法:

def driving_directions
  @address_to = params[:address_to]
  @address_from = params[:address_from]
  @map_center = params[:map_center_start]

  # if we were not given a center point to start our map on
  # let's create one.
  if !@map_center && @address_to
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll
  elsif !@map_center && @address_from
    @map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_from).ll
  end
end

def printer_friendly
  starting_point = params[:starting_point].split(',').collect{|e|e.to_f}
  ne = params[:ne].split(',').collect{|e|e.to_f}
  sw = params[:sw].split(',').collect{|e|e.to_f}
  size = params[:size].split(',').collect{|e|e.to_f}
  address = params[:address]

  @markers = retrieve_points(ne,sw,size,false)
  @map = initialize_map([[sw[0],sw[1]],[ne[0],ne[1]]],[starting_point[0],starting_point[1]],false,@markers,true)
  @address_string = address
end

解决方案

我实际上认为模块是在控制器之间共享代码的最佳方法。如果我们想在视图之间共享代码,则助手是很好的选择。助手基本上是美化的模块,因此,如果我们不需要视图级别的访问,建议我们将模块放在lib文件夹中。

创建模块后,必须使用include语句将其包含在所需的控制器中。

http://www.rubyist.net/~slagell/ruby/modules.html

我同意模块方法。在lib目录中创建一个单独的Ruby文件,然后将该模块放入新文件中。

最明显的方法是将这些方法添加到ApplicationController中,但是我确定我们已经知道这一点。

我认为,通常的OO设计原则适用:

  • 如果代码实际上是不需要访问对象状态的一组实用程序,那么我会考虑将其放在要单独调用的模块中。例如,如果代码是所有映射实用程序,则创建模块Maps并访问以下方法:Maps :: driving_directions。
  • 如果代码需要状态并且可以在每个控制器中使用或者可以在每个控制器中使用,则将代码放在ApplicationController中。
  • 如果代码需要状态并且被用于与逻辑紧密相关的所有控制器的子集(即所有有关地图的子集)中,则创建一个基类(类MapController <ApplicationController`)并将共享代码放在此处。
  • 如果代码需要状态并且被使用在不是很紧密相关的所有控制器的子集中,则将其放在模块中,并将其包含在必要的控制器中。

在情况下,方法需要状态(" p​​arams"),因此选择取决于需要状态的控制器之间的逻辑关系。
此外:

还:

  • 如有可能,请使用partials进行重复代码,并将partials放置在通用的" partials"目录中,或者通过特定路径包含。
  • 尽可能使用RESTful方法(对于方法),如果发现自己创建了许多非RESTful方法,请考虑将其提取到其自己的控制器中。

另一种可能性:

如果通用代码需要状态,并且我们想在控制器之间共享行为,则可以将其放在"模型"或者" lib"目录中的普通红宝石类中。请记住,即使所有ActiveRecord类都是持久性的,model类也不必是持久性的。换句话说,具有瞬态"模型"类是可以接受的。

如果要在控制器和助手之间共享代码,则应尝试在库中创建一个模块。我们也可以使用@template和@controller来访问controller和helper中的方法。
检查此以获取更多详细信息http://www.shanison.com/?p=305