当前位置:  开发笔记 > 后端 > 正文

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

如何解决《在RubyonRails中重用控制器之间代码的最佳实践》经验,为你挑选了3个好方法。

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

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

Ian Terrell.. 111

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

如果代码实际上是一组不需要访问对象状态的实用程序,我会考虑将它放在一个单独调用的模块中.举例来说,如果代码是所有测绘事业,创建一个模块Maps,并访问类的方法: Maps::driving_directions.

如果代码需要状态并且已在每个控制器中使用或可以使用,请将代码放在ApplicationController中.

如果代码需要状态并且在所有与密切和逻辑相关的控制器的子集中使用(即所有关于映射),则创建基类(class MapController < ApplicationController)并将共享代码放在那里.

如果代码需要状态并且在所有不是非常密切相关的控制器的子集中使用,则将其放在模块中并将其包含在必要的控制器中.

在您的情况下,方法需要state(params),因此选择取决于需要它的控制器之间的逻辑关系.此外:

也:

在可能的情况下对重复代码使用partials,并将其放在公共'partials'目录中或通过特定路径包含.

尽可能坚持RESTful方法(对于方法)如果你发现自己创建了许多非RESTful方法,请考虑将它们提取到自己的控制器.


小智.. 32

我知道这个问题是在6年前提出来的.只想指出在Rails 4中,现在控制器问题是一个更开箱即用的解决方案.



1> Ian Terrell..:

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

如果代码实际上是一组不需要访问对象状态的实用程序,我会考虑将它放在一个单独调用的模块中.举例来说,如果代码是所有测绘事业,创建一个模块Maps,并访问类的方法: Maps::driving_directions.

如果代码需要状态并且已在每个控制器中使用或可以使用,请将代码放在ApplicationController中.

如果代码需要状态并且在所有与密切和逻辑相关的控制器的子集中使用(即所有关于映射),则创建基类(class MapController < ApplicationController)并将共享代码放在那里.

如果代码需要状态并且在所有不是非常密切相关的控制器的子集中使用,则将其放在模块中并将其包含在必要的控制器中.

在您的情况下,方法需要state(params),因此选择取决于需要它的控制器之间的逻辑关系.此外:

也:

在可能的情况下对重复代码使用partials,并将其放在公共'partials'目录中或通过特定路径包含.

尽可能坚持RESTful方法(对于方法)如果你发现自己创建了许多非RESTful方法,请考虑将它们提取到自己的控制器.



2> 小智..:

我知道这个问题是在6年前提出来的.只想指出在Rails 4中,现在控制器问题是一个更开箱即用的解决方案.



3> danpickett..:

我实际上认为模块是在控制器之间共享代码的最佳方式.如果您想在视图之间共享代码,那么助手是很好的.助手基本上是美化模块,所以如果你不需要视图级访问,我建议你在lib文件夹中放置一个模块.

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

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

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有