ruby-on-rails - tipos - que es una clase en ruby
Rieles: Incluyendo una preocupaciĆ³n con una constante dentro de una preocupaciĆ³n (1)
Me preocupa que almacene constantes:
module Group::Constants
extend ActiveSupport::Concern
MEMBERSHIP_STATUSES = %w(accepted invited requested
rejected_by_group rejected_group)
end
Y otra preocupación que deseo usar estas constantes:
module User::Groupable
extend ActiveSupport::Concern
include Group::Constants
MEMBERSHIP_STATUSES.each do |status_name|
define_method "#{status_name}_groups" do
groups.where(:user_memberships => {:status => status_name})
end
end
end
Desafortunadamente, esto resulta en un error de enrutamiento:
uninitialized constant User::Groupable::MEMBERSHIP_STATUSES
Parece que la primera preocupación no se carga correctamente en la segunda preocupación. Si ese es el caso, ¿qué puedo hacer al respecto?
Parece que este comportamiento es por diseño, como se explica muy bien here .
Lo que tendrá que hacer en este caso es que no se extiendan las Group::Constants
de ActiveSupport::Concern
ya que esto impedirá que su implementación se comparta con otros módulos de extensión de ActiveSupport::Concern
(aunque finalmente se compartirá en una clase que incluye el segundo módulo):
module A
TEST_A = ''foo''
end
module B
extend ActiveSupport::Concern
TEST_B = ''bar''
end
module C
extend ActiveSupport::Concern
include A
include B
end
C::TEST_A
=> ''foo''
C::TEST_B
=> uninitialized constant C::TEST_B
class D
include C
end
D::TEST_A
=> ''foo''
D::TEST_B
=> ''bar''
En resumen, deberá hacer que el Group::Constants
un módulo estándar y, a continuación, todo estará bien.