2017-01-11 14 views
1

Rails5アプリケーションにいくつかの環境関連のポリシーを追加したいと思います。以下のように構造化したいと思います。Railsで正しく名前空間を設定する方法

app 
|_ policies 
     |_ development 
      |_ policy_x.rb 
     |_ production 
      |_ policy_x.rb 
     |_ test 
      |_ policy_x.rb 



Class Policies::Development::PolicyX 
end 

というように、私は私がNameError: uninitialized constant Policiesを得るようにしようとすると...

それから私は、私がこのような

しかし
MYPOLICY = Policies::Development::PolicyX 

として初期化子に必要な政策を呼び出します。

ここに何か不足していますか?

UPDATE1同じ構造を使用して

私は

module Policies 
    module Development 
    class PolicyX 
    end 
    end 
end 

module Policies 
    module Test 
    class PolicyX 
    end 
    end 
end 

module Policies 
    module Production 
    class PolicyX 
    end 
    end 
end 

を次のようにも私のクラスを定義したが、まだ同じエラーを取得しています。

おかげ

+0

'policy_x'の定義方法とその呼び出し方法を表示できますか? –

+0

定義は上記です。あなたが何を意味するのか分からない。 – macsig

+0

これは設定のようですが、 'config/environments/ .rb'に追加したくないのですか?ここでの利点は、追加の手間をかけずに現在の環境に基づいてロードできることです。 –

答えて

1

クラス/ファイル/フォルダ名規則

Railsは、あなたがクラスやファイル名を定義する方法についての規則の数を持っています。たとえば、PolicyXという名前のクラスは、policy_x.rbというファイル内に存在する必要があります。

モジュールやフォルダ構造についても同じです。

この標準的な規則に従わないと、Railsはクラスをロードできません。デフォルトでは

オートロードパス

Railsはapp/policiesを検索しますが、Railsはapp/

app/assets 
app/channels 
app/controllers 
app/controllers/concerns 
app/helpers 
app/jobs 
app/mailers 
app/models 
app/models/concerns 
app/policies 

下にあるすべてのフォルダの中に見え、それが命名し、階層規則を満たすそこにはPoliciesモジュールが見つかりません。これを行うには、あなたのフォルダ構造は

app 
    policies 
    policies 
     development 
     policy_x.rb 

...である必要があります。これは明らかに奇妙に見えます。

次の3つの異なる方法でこの問題を解決することができ:
は、a))がDevelopment::XPolicy
Cへのレールの規則
b)に変更Policies::Development::XPolicyに準拠するためにあなたのフォルダ構造および/またはモジュールの階層を変えるautoload_pathsappを追加します。 app/に直接目を通すと、Railsはpoliciesフォルダを見つけることができます。

# application.rb 
config.autoload_paths += %W(#{config.root}/app) 

PS:Railsはロードするためにどのようなファイルを見つけ出すために、モジュールまたはクラス名にunderscoreメソッドを使用しています。

2.3.0 :001 > 'PolicyX'.underscore 
=> "policy_x" 
+0

上記のUPDATE1 – macsig

+0

を参照してください。PolicyXクラスは 'policy_x.rb'ファイル内にあります – macsig

+0

私の更新された回答を確認してください。 –

関連する問題