[解決済み] 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なメソッドを多く作成している場合は、それらを独自のコントローラに抽出することを検討してください。
関連
-
[解決済み] どのようにrailsでラジオボタンを正しく使用するには?
-
[解決済み] 未初期化の定数 "コントローラ名"
-
[解決済み] Ruby on Railsのデータベースをパージまたは再作成する
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み】Ruby on Railsの@変数について
-
[解決済み】railsのcronジョブ:ベストプラクティス?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Rails。Ruby on Railsの移行でデータベースカラムの名前を変更するにはどうすればよいですか?
-
[解決済み】警告:定数 ::Fixnum は非推奨 新しいモデルを生成するとき
-
[解決済み] サーバーに接続できませんでした。そのようなファイルまたはディレクトリがありません (PG::ConnectionBad)
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] Rails のインストールに失敗する: activesupport には Ruby のバージョン >= 2.2.2 が必要です。
-
[解決済み] RVMでRubyのデフォルトバージョンを設定するには?
-
[解決済み] Railsはsaveでモデル内の検証をスキップしますか?
-
[解決済み] Railsでグループとカウント