Ruby on Rails のコントローラ間でコードを再利用するためのベストプラクティス 質問する

Ruby on Rails のコントローラ間でコードを再利用するためのベストプラクティス 質問する

共有したいコントローラー メソッドがいくつかあります。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 メソッドを多数作成している場合は、それらを独自のコントローラーに抽出することを検討してください。

おすすめ記事