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

Другие вопросы по тегам