【问题标题】:Ruby route for custom controller自定义控制器的 Ruby 路由
【发布时间】:2013-08-23 01:04:44
【问题描述】:

所以我想在访问:site.com/panel 时查看 /app/controller/panel/index_controller.rb

在我开始之前,我是 ruby​​ 的新手,我是几个小时前开始的

所以在我的 routes.rb 中我有这个

 namespace :panel do
   root 'index#index'
 resources :index
 end

我在 /app/controller/panel/index_controller.rb 中创建了一个名为 index_controller.rb 的文件,如下所示

class IndexController < ApplicationController
  def index
    @foo = "Foo"
  end
end

现在,当我转到 site.com/panel 时,我得到了这个:类 IndexController 的超类不匹配

我做错了什么? 我也可以在这里设置不同的视图和布局以用于 /app/controller/panel/*_controller.rb 中的控制器

【问题讨论】:

    标签: ruby-on-rails ruby rails-routing


    【解决方案1】:

    替换这个

    class IndexController < ApplicationController
    

    class Panel::IndexController < ApplicationController
    

    更新:

    要自动生成命名空间控制器,您可以使用 rails build in generator 像这样

    rails g controller panel/users
    

    这将在app/controllers/panel/users_controller.rb下生成Panel::Users &lt; ApplicationController控制器

    【讨论】:

    • 这回答了我的第一个问题,现在我该如何设置另一个布局,谢谢你的好回答
    • 在你的布局文件夹中添加一个新的布局..例如 app/views/layouts/panel.html.erb ..在你的控制器顶部指定布局:layout "panel"跨度>
    • 但是我想自动完成,我不想为 app/controller/panel/*_controller 中的每个控制器手动执行此操作
    【解决方案2】:

    由于您已在 panel 中为 index 资源路由命名,因此您需要在 IndexController 声明前添加前缀以反映这一点:

    # app/controllers/index_controller.rb
    class Panel::IndexController < ApplicationController
    

    然后,您可以类似地在文件系统中反映命名空间,以便让 Rails 正确调用正确的视图:

    /app/views/panel/index/index.html.erb
    /app/views/panel/index/show.html.erb
    ... etc
    

    注意:Rails 约定是声明为resources 的路由应命名为复数,因为这表示一个完全资源丰富的类。因此,根据这个范式,index 实际上应该是indexes。但是,我怀疑您可能意味着使用 singular 路由,在这种情况下,声明如下:

    namespace :panel do
        resource :index
    end
    

    这会创建以下奇异路线(可能更符合您想要完成的目标):

             panel_index POST   /panel/index(.:format)                         panel/indices#create
          new_panel_index GET    /panel/index/new(.:format)                     panel/indices#new
         edit_panel_index GET    /panel/index/edit(.:format)                    panel/indices#edit
                          GET    /panel/index(.:format)                         panel/indices#show
                          PUT    /panel/index(.:format)                         panel/indices#update
                          DELETE /panel/index(.:format)                         panel/indices#destroy
    

    【讨论】:

    • 这么棒的评论,视图有效,但我想我需要在 application_controller.rb 中进行某种检查才能更改为不同的布局,例如: if site_url == /panel将布局更改为 dis.html.erb
    • 是的,但是您的问题没有提及此要求。关于命名空间相关布局的问题与您已经问过的问题不同,IMO。如果这个答案能满足你的问题,你会考虑接受它是正确的吗?
    • 我也可以在这里设置不同的视图和布局以用于 /app/controller/panel/*_controller.rb 中的控制器,这是主要问题,我可以接受没有问题,很好的答案,但是我想你也可以帮我解决布局问题
    • 我会强烈建议在另一个问题中提出该问题...您的问题内容很快变得过于密集,并且您的问题更有可能吸引高质量的解决方案,如果你保持简洁和重点(再次,IMO)。
    • 仅供参考,在panel 命名空间中为每个控制器声明布局可能会更容易和更清晰。为命名空间实现包罗万象的布局所需的逻辑比仅仅为每个控制器添加声明要复杂得多。但是,如果您倾向于采用包罗万象的方法,那么以下答案可能会有所帮助:stackoverflow.com/questions/4221856/…
    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 2011-12-03
    • 2015-10-12
    • 2013-09-30
    • 2018-09-14
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多