2012-08-14 18 views
18

文字列を処理するための特定のメソッドや、多数のコントローラで実行されるその他のタスクを記述したいと考えています。あなたのコントローラにヘルパーを含めるという悪い習慣を知っているので、私はちょうどコントローラで使用されているアプリケーション全体のメソッドを置くのに最適な場所はどこですか?コントローラ専用のヘルパーメソッドはどこに置くのですか?

モデルに入れて言う人もいると思いますが、すべてのコントローラに関連するモデルがあるわけではありません。任意のすべての入力をいただければ幸いです。

答えて

10

アプリケーションスコープでメソッドを使用する必要がある場合は、それらのメソッドをアプリケーションコントローラ内に保持し、それらをビュー内で使用することをお勧めします。これらをヘルパーメソッドとして宣言します。これらの方法は、多数のコントローラで使用されている場合、例えば

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 
+0

多くのヘルパーメソッドがある場合、 'ApplicationController'は扱いにくくなる可能性があります。Semyon Perepelitsaの答えにあるように、メソッドをヘルパーファイルに分類し、 'ApplicationController'にファイルをインクルードする方が好きです。 –

0

は、私がapplication_controller.rbでそれらを定義します。すべてのコントローラーはそこから継承し、そこに定義されている方法を使用することができます

11

私はそれらをヘルパーに入れる傾向があります。それらがビュー に自動的に含まれているという事実は私にとっては問題ではありません。また、 に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 
+0

それは私がやっていることです。 –

+0

これは、すべてのヘルパーメソッドをアプリケーションコントローラに詰め込むよりも、私にとって意味があります。 – dscher

5

。だから、例えば私が持っている:

lib/utils/string_utils 

module StringUtils 

    def foo 
    ... 
    end 
end 

class BarController < ActionController::Base 
    include StringUtils 
end 

これは、我々はロジックを分離する代わりに、モデルのミックスインを使用しているが、考え方は同じである。この場合には脂肪モデル、シンコントローラと呼ばれる優れた方法論を、示しています。あなたはコントローラをできるだけシンプルにしたい。

2

すべてはお客様のニーズに応じて異なります。ここでは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ディレクトリです。

0

Rails 4からは、専用のフォルダapp/controllers/concernsがあります。したがって、そこにモジュールを作成し、それを特定のコントローラまたはApplicationControllerに含めることができます。

関連する問題