ruby-on-rails - 在 Ruby on Rails 中重用 Controller 之间代码的最佳实践

标签 ruby-on-rails ruby

我想分享一些 Controller 方法。在 ruby​​ on rails 中执行此操作的最佳做​​法是什么?我应该创建一个我的 Controller 扩展的抽象类,还是应该创建模块并将其添加到每个 Controller 中?以下是我想分享的 Controller 方法:

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

最佳答案

在我看来,正常的 OO 设计原则适用:

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

在您的情况下,方法需要状态 ( params ),因此选择取决于需要它的 Controller 之间的逻辑关系。 此外:

还有:

  • 尽可能对重复代码使用分部,并将其放置在公共(public)“分部”目录中或通过特定路径包含。
  • 尽可能(对于方法)坚持使用 RESTful 方法,如果您发现自己创建了很多非 RESTful 方法,请考虑将它们提取到它们自己的 Controller 中。

关于ruby-on-rails - 在 Ruby on Rails 中重用 Controller 之间代码的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/128450/

相关文章:

ruby-on-rails - 请安装 postgresql 适配器 : `gem install activerecord-postgresql-adapter`

ruby-on-rails - RSpec: Controller 规范的多个断言

python - 如何卸载pycharm和rubymine?

ruby - 动态模块 : Querying tables with secondary index

ruby - 无法使用 Ruby 发送终端命令

ruby-on-rails - 参数错误 : wrong # of arguments(0 for 1) Rails Unit Testing

ruby - ruby 有没有好的 DNS 服务器库?

ruby-on-rails - has_many 关系中的 Active Record 对象何时保存?

ruby-on-rails - RubyMine 找不到 RSpec 规范

ruby-on-rails - Solidus 运费计算器错误