共有したいコントローラー メソッドがいくつかあります。Ruby on Rails でこれを行うためのベスト プラクティスは何ですか? コントローラーが拡張する抽象クラスを作成する必要がありますか、それともモジュールを作成して各コントローラーに追加する必要がありますか? 以下は共有したいコントローラー メソッドです。
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
ベストアンサー1
私の意見では、通常の OO 設計原則が適用されます。
- コードが実際にはオブジェクトの状態にアクセスする必要のないユーティリティのセットである場合は、それをモジュールに入れて個別に呼び出すことを検討します。たとえば、コードがすべてマッピング ユーティリティである場合は、モジュール を作成し
Maps
、次のようなメソッドにアクセスしますMaps::driving_directions
。 - コードに状態が必要で、すべてのコントローラーで使用されるか、使用される可能性がある場合は、コードを ApplicationController に配置します。
- コードに状態が必要であり、密接かつ論理的に関連するすべてのコントローラーのサブセットで使用される場合 (つまり、すべてマップに関するもの)、基本クラス (
class MapController < ApplicationController
) を作成し、そこに共有コードを配置します。 - コードに状態が必要であり、あまり密接に関連していないすべてのコントローラーのサブセットで使用される場合は、コードをモジュールに配置し、必要なコントローラーに含めます。
あなたの場合、メソッドには状態 ( params
) が必要なので、選択はそれを必要とするコントローラー間の論理関係によって決まります。さらに、
また:
- 繰り返しコードの場合は可能な場合は部分コードを使用し、共通の「partials」ディレクトリに配置するか、特定のパス経由で含めます。
- 可能な場合は(メソッドに対して)RESTful アプローチを採用し、非 RESTful メソッドを多数作成している場合は、それらを独自のコントローラーに抽出することを検討してください。