Ruby on Rails - 控制器子目录

Posted

技术标签:

【中文标题】Ruby on Rails - 控制器子目录【英文标题】:Ruby on Rails - Controller Subdirectory 【发布时间】:2016-05-20 06:33:58 【问题描述】:

我对 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

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

【问题讨论】:

【参考方案1】:

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:: 超类。

【讨论】:

【参考方案2】:

在 config/routes.rb 中

namespace :namespace_name do
  resources : resource_name
end

在应用程序/控制器/

用你的命名空间名称创建一个模块名称,在那个地方你的控制器 在那个控制器类名应该像 类命名空间名称::ExampleController

【讨论】:

【参考方案3】:

尝试改用命名空间:

在您的路线中:

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

在您的控制器中:

class Groupa::AthingController < ApplicationController

在浏览器中:

localhost:3000/groupa/athing/

【讨论】:

以上是关于Ruby on Rails - 控制器子目录的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:将数组的 javascript 数组发送到 ruby​​ 控制器

ruby on rails(基础)

Ruby on Rails - 从视图调用控制器方法

如何在 ruby​​ on rails 中获取控制器和操作列表?

ruby on rails 中的控制器和动作有啥区别?

Ruby on Rails——静态页面的独立控制器方法