2016-03-07 3 views
2

Как я могу определить Rails (5 beta3) для поиска моделей с именами в app/models вместо app/models/namespace?Как я могу сказать Rails для автозагрузки моделей с именами из каталога верхнего уровня?

У меня есть

module MyApp 
    class User < ApplicationRecord 
    ... 
    end 
end 

и если я положил его в app/models/myapp Rails находит. Однако, поскольку все мои модели будут находиться в модуле MyApp, я бы лучше сохранил их в app/models.

Благодаря

+2

Hi. Я уверен, что вы это знаете. Но, похоже, вы сражаетесь с соглашениями Rails на этом. Интересно, не лучше ли вам следовать правилам. Не ответ на ваш вопрос (извините за это), просто мысль. – jvillian

+0

Да, я знаю это, и было бы концом Мира, если мне придется использовать дополнительную папку, но я хотел бы знать, есть ли простой способ держать вещи чище. Спасибо – macsig

ответ

3

Нет, вы не можете сказать Rails искать квалифицированную постоянная (как MyApp::User) на верхнем уровне каталога на пути автозагрузки как (app/models). Когда Rails видит MyApp::User (в коде, который не входит в определение модуля), он будет искать только my_app/user.rb в каталогах в пути автозагрузки.

Вы можете много раз обманывать Rails, никогда не используя квалифицированные константы. Если ваши контроллеры находятся в том же пространстве имен, следующий будет работать:

приложение/контроллеры/my_app/users_controller.rb

module MyApp 
    class UsersController < ApplicationController 
    def index 
     @users = User.all 
    end 
    end 
end 

приложение/модели/user.rb

module MyApp 
    class User < ActiveRecord::Base 
    end 
end 

Rails Безразлично Не знаю, относится ли User к контроллеру на верхнем уровне или в MyApp, поэтому он будет искать как app/models/user.rb, так и app/models/my_app/user.rb. Точно так же вы можете автозагружать модели с расширением имен в app/models из других моделей с именами.

Однако вы попали бы на стену (то есть, вам придется вручную потребовать файл класса модели), как только вам понадобится обратиться к модели с именами из кода, который сам не был в пространстве имен, например. в консоли или в модульном тесте. И было бы глупо иметь контроллеры в подкаталоге, но модели не в подкаталоге. И вы будете путать всех, кто посмотрел ваш код. Поэтому лучше всего будет следовать правилам Rails и поместить ваши модели с именами в подкаталог app/models.