1. ホーム
  2. ruby-on-rails

[解決済み] Ruby on Railsでコントローラ間のコードを再利用するためのベストプラクティス

2023-06-21 20:11:07

質問

共有したいコントローラメソッドがいくつかあります。これを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

どのように解決するのですか?

私の考えでは、通常のOO設計の原則が適用されます。

  • もしコードが本当にオブジェクトの状態にアクセスする必要のないユーティリティのセットであるなら、私はそれを別々に呼び出されるモジュールに入れることを検討します。 たとえば、コードがすべてマッピング ユーティリティである場合、モジュールを作成して Maps のように、メソッドにアクセスします。 Maps::driving_directions .
  • コードが状態を必要とし、すべてのコントローラで使用される、または使用される可能性がある場合、そのコードをApplicationControllerに置きます。
  • コードが状態を必要とし、密接かつ論理的に関連するすべてのコントローラのサブセットで使用される場合 (つまり、すべてマップに関するもの) は、ベースクラス ( class MapController < ApplicationController ) を作成し、共有コードをそこに置きます。
  • コードが状態を必要とし、あまり密接に関連しないすべてのコントローラのサブセットで使用される場合、それをモジュールに入れ、必要なコントローラにインクルードします。

あなたの場合、メソッドが状態を必要とする ( params ) が必要なので、それを必要とするコントローラ間の論理的な関係によって選択します。 さらに

また

  • 繰り返されるコードには可能な限りパーシャルを使用し、共通の「partials」ディレクトリに置くか、特定のパスを通してインクルードします。
  • 可能な限りRESTfulなアプローチにこだわり、(メソッドについて)非RESTfulなメソッドを多く作成している場合は、それらを独自のコントローラに抽出することを検討してください。