Ruby on Rails中控制器之间重用代码的最佳方法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

我有一些我想分享的控制器方法。在rubyrails上的最佳做法是什么?是否应该创建一个我的控制器扩展的抽象类,还是应该创建模块并将其添加到每个控制器中?以下是我的控制器方法:

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
提问于
用户回答回答于

我认为,一般的面向对象设计原则适用于:

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

此外:

  • 在可能的情况下,使用Parals进行重复代码,或者将其放置在公共的“Parals”目录中,或者通过特定的路径进行包含。
  • 如果可能的话,坚持RESTful方法(对于方法),如果你发现自己创建了很多non-RESTful的方法,也考虑将它们提取到自己的控制器中。
用户回答回答于

在Rails 4中,现在有了Controller Concerns,这是一个更加好的解决方案。

扫码关注云+社区