簡體   English   中英

Rails:在關注中包含一個具有常量的關注

[英]Rails: Including a Concern with a constant within a Concern

我擔心我存儲常量:

module Group::Constants
  extend ActiveSupport::Concern

  MEMBERSHIP_STATUSES = %w(accepted invited requested
    rejected_by_group rejected_group)
end

我希望使用這些常量的另一個問題是:

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

不幸的是,這會導致路由錯誤:

uninitialized constant User::Groupable::MEMBERSHIP_STATUSES

看起來第一個關注點在第二個關注點中沒有正確加載。 如果是這種情況,我該怎么辦?

看來這種行為是設計使然,正如這里很好地解釋的那樣。

在這種情況下,您需要做的不是讓Group::ConstantsActiveSupport::Concern擴展,因為這將阻止其實現與其他ActiveSupport::Concern擴展模塊共享(盡管它最終將在一個類中共享)包括第二個模塊):

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'

簡而言之,您需要使Group::Constants成為標准模塊,然后一切都會好起來的。

如果您想將所有內容保存在一個文件中,並且可以忍受一些樣板文件,則可以將模塊分解為“關注”位和“非關注”位:

module A
  FOO = [22]

  def self.included base
    base.include Concern
  end

  module Concern
    extend ActiveSupport::Concern

    class_methods do
      def foo_from_the_perspective_of_a_class_method_in_A
        {lexical: FOO, instance: self::FOO}
      end
    end
  end
end

module B
  extend ActiveSupport::Concern

  include A

  FOO += [33]

  def foo_from_the_perspective_of_an_instance_method_in_B
    FOO
  end
end

class C
  include B
end


C.foo_from_the_perspective_of_a_class_method_in_A
=> {:lexical=>[22], :instance=>[22, 33]}
C.new.foo_from_the_perspective_of_an_instance_method_in_B
=> [22, 33]
C::FOO
=> [22, 33]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM