En primer lugar, estoy siguiendo la práctica encontrado aquí por preocupaciones carriles (gran idea!): https://gist.github.com/1014971Rails 3 Módulos preocupación por modelos
estoy recibiendo un error sin embargo:
undefined method `search' for #<Class:0x5c25ea0>
app/controllers/accessories_controller.rb:6:in `index'
I DO tengo mi directorio/app/models/concerns/cargado en /config/application.rb. Entonces los módulos de "preocupación" ESTÁN siendo cargados. Solo quería señalar eso.
Aquí está mi código:
/app/models/concerns/searchable.rb
module Searchable
extend ActiveSupport::Concern
# Add a "search" scope to the models
def self.search (search)
if search
where('name LIKE ?', "%#{search}%")
else
scoped
end
end
end
/app/models/accessory.rb
class Accessory < ActiveRecord::Base
include Searchable
...
end
/app/controllers/accessories_controller.rb
class AccessoriesController < ApplicationController
def index
@accessories = Accessory.search(params[:search])
...
end
end
¡Qué bueno que lo haya descubierto usted mismo! Un par de consejos más: No debe poner un espacio entre la definición del método y los argumentos para el método. Simplemente no se hace así en el mundo de Ruby. Ahora con respecto al método 'incluido', lo que hará es evaluar ese bloque completo dentro del contexto de la clase. Si desea definir métodos para la clase, recomendaría simplemente definir los métodos en el módulo en sí, en lugar de incluirlos también dentro del bloque incluido. –
Gracias por el recordatorio sobre el nombre del método. Mis propias "mejores prácticas" a veces se deslizan aquí y allá de vez en cuando. Entiendo lo que dices sobre el bloque 'incluido'. Si estuviera definiendo un método que no es propio, lo pondría fuera del bloque. ¡Gracias! –