ruby-on-rails - guia - rutas en ruby on rails
¿Dónde poner métodos de ayuda solo para los controladores? (6)
A partir de Rails 4 hay una carpeta dedicada para su app/controllers/concerns
. Por lo tanto, puede crear un módulo allí y luego incluirlo en uno o varios controladores específicos o en ApplicationController si lo necesita disponible en todos sus controladores.
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: ¿cuál es el mejor lugar para poner los métodos de aplicación utilizados en los 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. Cualquier y todos los comentarios serían apreciados.
En caso de que esos métodos se usen en numerosos controladores, los definiría en application_controller.rb
. Cada controlador heredará de él y podrá usar cualquier método definido allí.
Si necesita utilizar un método en el ámbito de la aplicación, le sugiero que mantenga esos métodos dentro del controlador de la aplicación y para usarlos en las vistas ... declare que son 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
Tiendo a ponerlos en ayudantes. El hecho de que se incluyan en vistas automáticamente no ha sido un problema para mí. También puede colocarlos en algo como app / preocupaciones / o lib /
No me gusta saturar ApplicationController con métodos privados porque a menudo esto 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
Todo depende de tus necesidades. Proporcionaré aquí 2 ejemplos. Ambos son solo bibliotecas personalizadas, ubicadas en el directorio lib
.
Primer ejemplo - "procesamiento de cadena personalizado"
# 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 olvide agregar el directorio lib
a las rutas de carga automática. En config/application.rb
agregue / modifique esta línea config.autoload_paths += %W(#{config.root}/lib)
. Así que para mí la respuesta es el directorio lib
.
Yo sugeriría ponerlos en la carpeta lib
. Así que 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 llamada modelo Fat, controlador Thin , en este caso estamos utilizando Mixins en lugar de Modelos para separar la lógica, pero la idea es la misma. Usted quiere que sus controladores sean lo más simples posible.