Ruby on Rails - Подкаталог контроллера
Я немного новичок в RoR,
Я хочу иметь структурированный каталог, потому что проект может стать большим, я не хочу иметь все контроллеры напрямую controllers
каталог.
Я хотел бы что-то как
app/
controllers/
application_controller.rb
groupa/
athing_controller.rb
athing2_controller.rb
groupb/
bthing_controller.rb
Однако, когда я помещаю в маршруты.rb следующее:
get 'athing', :to => "groupa/athing#index"
Я получаю следующую ошибку на localhost: 3000 / athing /:
несоответствие суперкласса для класса AthingController
Что похоже на:
class AthingController < ApplicationController
def index
end
end
Я что-то пропустил? Могу ли я разместить подкаталоги вообще?
3 ответа
Попробуйте вместо этого использовать пространство имен:
В ваших маршрутах:
namespace :groupa do
get 'athing', :to => "athing#index"
end
В вашем контроллере:
class Groupa::AthingController < ApplicationController
В браузере:
localhost:3000/groupa/athing/
Когда вы помещаете ваши контроллеры (классы) в подкаталог, Ruby/Rails ожидает, что он подкласс от родительского (module
):
#app/controllers/group_a/a_thing_controller.rb
class GroupA::AThingController < ApplicationController
def index
end
end
#config/routes.rb
get :a_thing, to: "group_a/a_thing#index" #-> url.com/a_thing
Я изменил названия вашей модели / каталога, чтобы они соответствовали Ruby snake_case
конвенция:
- использование
snake_case
для именования каталогов, напримерlib/hello_world/hello_world.rb
- использование
CamelCase
для классов и модулей, напримерclass GroupA
Rails маршрутизация имеет namespace
директива, чтобы помочь:
#config/routes.rb
namespace :group_a do
resources :a_thing, only: :index #-> url.com/group_a/a_thing
end
... так же module
директива:
#config/routes.rb
resources :a_thing, only: :index, module: :group_a #-> url.com/a_thing
scope module: :group_a do
resources :a_thing, only: :index #-> url.com/a_thing
end
Разница в том, что namespace
создает subdir в ваших маршрутах, module
просто отправляет путь к подчиненному контроллеру.
Оба вышеперечисленных требуют GroupA::
суперкласс на ваших подкаталогах контроллеров.
В конфиге /ways.rb
namespace :namespace_name do
resources : resource_name
end
В приложении / контроллеры /
создайте имя модуля с вашим namespace_name, в этом месте ваши контроллеры. В этом контроллере имя класса должно быть похоже на namespace_name класса::ExampleController