Как правильно использовать пространства имен и эталонные модели, наследуемые от других (mongoid/rails)?

У меня есть модель HandlingScenario, которая наследуется от Scenario. Как это:

## models/scenario.rb
class Scenario
  include Mongoid::Document
end

## models/scenarios/handling_scenario.rb
class Scenarios::HandlingScenario < Scenario
  include Mongoid::Document
  belongs_to :user, :inverse_of => :handling_scenarios  # In the `User` model, the reference is `has_many :handling_scenarios`
end

Но когда я пытаюсь получить доступ к классу HandlingScenario, у меня возникают проблемы:

➜  rails c
Loading development environment (Rails 3.2.12)
2.0.0-p247 :001 > User.first.handling_scenarios
LoadError: Expected /Users/christoffer/Projects/my_project/app/models/scenarios/handling_scenario.rb to define HandlingScenario

Кроме того, когда я пытаюсь зайти через браузер, я получаю эту ошибку:

Started GET "/scenarios/handling_scenarios" for 127.0.0.1 at 2013-10-06 19:41:29 +0200
Processing by Scenarios::HandlingScenariosController#index as HTML
  MOPED: 127.0.0.1:27017 QUERY        database=my_project_development collection=users selector={"$query"=>{"_id"=>"518f599683c336fb87000003"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.3998ms)
Completed 500 Internal Server Error in 7ms

NameError - uninitialized constant HandlingScenario:

Действия контроллера:

## controllers/scenarios/handling_scenarios_controller.rb
class Scenarios::HandlingScenariosController < ScenariosController
  def index
    @handling_scenarios = current_user.handling_scenarios
  end
end

И мои маршруты:

## config/routes.rb
namespace :scenarios do
  resources :handling_scenarios do
    member do
      ...
    end
  end
end

person Cjoerg    schedule 06.10.2013    source источник


Ответы (1)


Используйте параметр class_name для отношения has_many :handling_scenarios, чтобы рельсы знали, что модель processing_scenario находится в файле scripts/handling_scenario.rb:

## models/user.rb
class User
   include Mongoid::Document
   has_many :handling_scenarios, class_name: "Scenarios::HandlingScenario"
end

См.: http://mongoid.org/en/mongoid/docs/relations.html

Кроме того, вам не нужно включать Mongoid::Document в ваш Scenarios::HandlingScenario, так как он унаследован от Scenario.

person Enrique Fueyo    schedule 07.10.2013