我对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
我错过了什么吗? 我可以放置子目录吗?
答案 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)
当你把你的控制器(类)放到一个子目录中时,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::
超类。