Ruby on Rails - 控制器子目录

时间:2016-02-10 03:15:24

标签: ruby-on-rails ruby controller routes subdirectory

我对RoR有点新鲜,

我想拥有一个结构化目录,因为项目可能会变大我不希望所有控制器直接进入controllers目录。

我想要一些东西

app/
    controllers/
          application_controller.rb
          groupa/
                athing_controller.rb
                athing2_controller.rb
          groupb/
                bthing_controller.rb

但是,当我在 routes.rb 中放置以下内容时:

get 'athing', :to => "groupa/athing#index"

我在 localhost:3000 / athing /

上收到以下错误
  

类AthingController的超类不匹配

这就像:

class AthingController < ApplicationController
  def index
  end
end

我错过了什么吗? 我可以放置子目录吗?

3 个答案:

答案 0 :(得分:11)

尝试使用命名空间:

在您的路线中:

namespace :groupa do
  get 'athing', :to => "athing#index"
end

在您的控制器中:

class Groupa::AthingController < ApplicationController

在浏览器中:

localhost:3000/groupa/athing/

答案 1 :(得分:2)

在config / routes.rb

namespace :namespace_name do
  resources : resource_name
end

在app / controllers /

使用您的namespace_name在您的控制器中创建一个模块名称 在那个控制器类名应该是这样的     class namespace_name :: ExampleController&lt; ApplicationController中

答案 2 :(得分:2)

Modularity

当你把你的控制器(类)放到一个子目录中时,Ruby / Rails希望它从父(module)到subclass

#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 convention

  
      
  • 使用snake_case命名目录,例如lib/hello_world/hello_world.rb
  •   
  • 对类和模块使用CamelCase,例如class GroupA
  •   

Rails路由有namespace directive来帮助:

#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路由中创建了一个子目录,module只是将路径发送到子目录控制器。

以上两个都需要子目录控制器上的GroupA::超类。