2012-08-14 24 views
18

Estoy buscando escribir ciertos métodos para procesar cadenas y otras tareas que tienen lugar en muchos de mis controladores. Sé que es una mala práctica incluir ayudantes en su controlador, así que me preguntaba, ¿dónde está el mejor lugar para aplicar los métodos de aplicación amplia en los controladores?donde poner métodos auxiliares solo para controladores?

Me doy cuenta de que algunos de ustedes dirán que los pongan en modelos, pero deben darse cuenta de que no todos mis controladores tienen un modelo asociado. Cualquiera y toda la entrada sería apreciada.

Respuesta

10

Si necesita utilizar un método en el ámbito de la aplicación, le sugiero que guarde esos métodos dentro del controlador de la aplicación y para usarlos en las vistas ... declare esos como métodos auxiliares.

Por ejemplo,

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

El problema es que si hay muchos métodos auxiliares, 'ApplicationController' puede volverse difícil de manejar.Prefiero dividir los métodos en archivos auxiliares por categoría, e incluir los archivos en 'ApplicationController', como se sugiere en la respuesta de Semyon Perepelitsa. –

0

En caso de utilizar estos métodos en numerosos controladores, me definirlos en application_controller.rb. Cada controlador heredará de él y podrá usar cualquier método definido allí

11

Tiendo a ponerlos en ayudantes. El hecho de que estén incluidos en las vistas automáticamente no ha sido un problema para mí. También puede colocarlos en algo así como aplicación/inquietudes/o lib/

No me gusta abarrotar ApplicationController con métodos privados porque esto a menudo se convierte en un desastre.

Ejemplo:

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

Eso es lo que hago, también. –

+0

Esto tiene más sentido para mí que rellenar todos los métodos de ayuda en el controlador de aplicaciones. – dscher

5

sugeriría a ponerlos en lib carpeta. Así, por ejemplo tengo:

lib/utils/string_utils 

module StringUtils 

    def foo 
    ... 
    end 
end 

class BarController < ActionController::Base 
    include StringUtils 
end 

Esto demuestra una buena metodología denominada modelo de grasa, el controlador Thin, en este caso estamos usando Mixins en lugar de modelos para separar la lógica, pero la idea es la misma. Desea que sus controladores sean lo más simples posible.

2

Todo depende de sus necesidades. Proporcionaré aquí 2 ejemplos. Ambas son solo bibliotecas personalizadas, ubicadas en el directorio lib.

Primer ejemplo - "procesamiento cadena personalizada"

# 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 

Segundo ejemplo - ayudante para mensajes flash

# 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 

Nota: no se olvide de añadir lib dir a los caminos de autocarga . En config/application.rb agregue/modifique esta línea config.autoload_paths += %W(#{config.root}/lib). Entonces, para mí, la respuesta es lib directorio.

0

A partir de Rails 4 hay una carpeta dedicada para él app/controllers/concerns. De modo que puede crear un módulo allí y luego incluirlo en un controlador o controladores específicos o en ApplicationController si lo necesita disponible en todos sus controladores.

Cuestiones relacionadas