0

Rails:3.2.11

私はこのモジュールを持っており、libで必要ですapplication.rbFORBIDDEN_USERNAMESアプリ全体で定数を利用できるようにしたいと思います。定数は、ルートから生成された値の配列です。ルートがまだロードされていないため、これを初期化子にすることはできません。

私が以下に持っているものFORBIDDEN_USERNAMESは、空の配列を返すので機能しません。

# in lib
module ForbiddenUsernames    
  def self.names
    Rails.application.reload_routes!
    all_routes = Rails.application.routes.routes

    all_names = Array.new
    all_routes.each do |route|
      # populate all_names array
    end
    all_names.uniq
  end
end

FORBIDDEN_USERNAMES = ForbiddenUsernames.names
# when ForbiddenUsernames.names is called by itself, it does not return [] or nil

アプリ全体で、使用できるようにするにはどうすればよいFORBIDDEN_USERNAMESですか?ありがとうございました!

4

1 に答える 1

1

なぜこれを一定にしたいのかわかりません。私には、覚えやすい振る舞いを使用できるようです。

# Wherever in your controller. Add helper_method if you need in the view (but would seem wrong)
def forbidden_usernames
  @forbidden_usernames ||= ForbiddenUsernames.names
end
helper_method :forbidden_usernames

ForbiddenUsernames.namesは、@ forbidden_​​usernamesがnilの場合に呼び出されるため、1回だけ発生します。

アップデート

# app/models/user.rb
def forbidden_usernames
  @forbidden_usernames ||= ForbiddenUsernames.names
end

def validate_not_forbidden
  !forbidden_usernames.include?(self.name)
end

複数のモデルでこの機能が必要な場合は、モジュールを使用してください。モジュール自体にforbidden_​​usernamesメモ化メソッドを含めることもできます。

module ForbiddenUsernames    
  def self.names
    @forbidden_names ||= self.populates_all_names
  end

  protected

  def populate_all_names
    Rails.application.reload_routes!
    all_routes = Rails.application.routes.routes

    all_names = Array.new
    all_routes.each do |route|
      # populate all_names array
    end
    all_names.uniq
  end
end
于 2013-02-02T14:07:41.263 に答える