tutorial rutas rails guia generate example crear controlador ruby-on-rails ruby-on-rails-3

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.