文字列を処理するための特定のメソッドや、多数のコントローラで実行されるその他のタスクを記述したいと考えています。あなたのコントローラにヘルパーを含めるという悪い習慣を知っているので、私はちょうどコントローラで使用されているアプリケーション全体のメソッドを置くのに最適な場所はどこですか?コントローラ専用のヘルパーメソッドはどこに置くのですか?
モデルに入れて言う人もいると思いますが、すべてのコントローラに関連するモデルがあるわけではありません。任意のすべての入力をいただければ幸いです。
文字列を処理するための特定のメソッドや、多数のコントローラで実行されるその他のタスクを記述したいと考えています。あなたのコントローラにヘルパーを含めるという悪い習慣を知っているので、私はちょうどコントローラで使用されているアプリケーション全体のメソッドを置くのに最適な場所はどこですか?コントローラ専用のヘルパーメソッドはどこに置くのですか?
モデルに入れて言う人もいると思いますが、すべてのコントローラに関連するモデルがあるわけではありません。任意のすべての入力をいただければ幸いです。
アプリケーションスコープでメソッドを使用する必要がある場合は、それらのメソッドをアプリケーションコントローラ内に保持し、それらをビュー内で使用することをお勧めします。これらをヘルパーメソッドとして宣言します。これらの方法は、多数のコントローラで使用されている場合、例えば
、class ApplicationController < ActionController::Base
helper_method :current_user, :some_method
def current_user
@user ||= User.find_by_id(session[:user_id])
end
def some_method
end
end
は、私がapplication_controller.rb
でそれらを定義します。すべてのコントローラーはそこから継承し、そこに定義されている方法を使用することができます
私はそれらをヘルパーに入れる傾向があります。それらがビュー に自動的に含まれているという事実は私にとっては問題ではありません。また、 にapp/concerns/lib/
のように置くこともできます。プライベートメソッド が混乱することがよくありません。
例:私はlib
フォルダにそれらを配置することをお勧め
module AuthenticationHelper
def current_user
@current_user # ||= ...
end
def authenticate!
redirect_to new_session_url unless current_user.signed_in?
end
end
module MobileSubdomain
def self.included(controller)
controller.before_filter :set_mobile_format
end
def set_mobile_format
request.format = :mobile if request.subdomain == "m"
end
end
class ApplicationController
include AuthenticationHelper
include MobileSubdomain
end
それは私がやっていることです。 –
これは、すべてのヘルパーメソッドをアプリケーションコントローラに詰め込むよりも、私にとって意味があります。 – dscher
。だから、例えば私が持っている:
lib/utils/string_utils
module StringUtils
def foo
...
end
end
class BarController < ActionController::Base
include StringUtils
end
これは、我々はロジックを分離する代わりに、モデルのミックスインを使用しているが、考え方は同じである。この場合には脂肪モデル、シンコントローラと呼ばれる優れた方法論を、示しています。あなたはコントローラをできるだけシンプルにしたい。
すべてはお客様のニーズに応じて異なります。ここでは2つの例を示します。両方とも、lib
ディレクトリにあるカスタムライブラリです。
まず例 - "カスタム文字列処理"
# lib/filters.rb
module Filters
# Converts value to canonical view
def self.phone(value)
# remove all non-digits
clean_value = value.gsub(/\D/, '')
country_codes = configus.phone.country_codes
area_code = configus.phone.defaults.area_code
case clean_value.length
when 7
"#{area_code}#{clean_value}"
when 11
# remove country code only if phone starts with the allowed country code
if country_codes.include?(clean_value[0].to_i)
clean_value[1..-1]
else
clean_value
end
else clean_value
end
end
# usage
# app/api/phones_controller.rb
class Api::PhonesController < Api::ApplicationController
def exists
if params[:q]
clean_value = Filters.phone(params[:q])
...
end
end
end
第二の例 - フラッシュメッセージのためのヘルパー
# lib/flash_helper.rb
module FlashHelper
def flash_translate(key, options = {})
scope = [:flash, :controllers]
scope += params[:controller].split('/')
scope << params[:action]
t(key, {:scope => scope}.merge(options))
end
end
# app/application_controller.rb
class ApplicationController < ActionController::Base
include FlashHelper
end
# usage
# app/your_controller.rb
class YourController < ApplicationController
def create
@object = Object.new(params[:object])
if @object.save
flash[:success] = flash_translate(:success)
...
end
end
end
注:オートロードパスにlib
ディレクトリを追加することを忘れないでください。 config/application.rb
このラインを追加/修正config.autoload_paths += %W(#{config.root}/lib)
。 私のために答えはlib
ディレクトリです。
Rails 4からは、専用のフォルダapp/controllers/concerns
があります。したがって、そこにモジュールを作成し、それを特定のコントローラまたはApplicationControllerに含めることができます。
多くのヘルパーメソッドがある場合、 'ApplicationController'は扱いにくくなる可能性があります。Semyon Perepelitsaの答えにあるように、メソッドをヘルパーファイルに分類し、 'ApplicationController'にファイルをインクルードする方が好きです。 –