【问题标题】:Namespace, static pages, and inherited controllers, what files in what folders?命名空间、静态页面和继承的控制器,哪些文件夹中的哪些文件?
【发布时间】:2012-07-05 10:20:43
【问题描述】:

我正在构建一个管理控制面板(尝试;))。

我一直在查看Backend administration in Ruby on Rails,并按照建议尝试让 Admin::AdminController 检查管理员并设置布局等。

但我也尝试在其中设置一个路由,将 /admin 路由到 /admin/dash

根据我对阅读http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing的理解,特别是第2.6节,

Admin::AdminController

告诉rails Admin 是名称空间,AdminController 是控制器,它是ApplicationController 的子类(扩展?接口的实现?)。这意味着控制器应该存在于 app/controllers/admin/ 并被称为 admin_controller.rb。

但我想要的是

管理员控制器

我收到如下错误:

uninitialized constant Admin::Controller

我的路线代码:

  match :admin, :to => 'admin/admin#dash'
  namespace :admin do
    # Directs to /admin/resources/*
    match '/dash', to: '#dash'
    resources :users, :pictures
  end

我已将控制器放在 app/controllers/admin、app/controllers 和组合中

class Admin::AdminController < ApplicationController
  before_filter :admin_user
  # / ** STATIC ADMIN PAGES ** /
  def dash
  end
end

或类 AdminController

编辑:也许这是我对路由的理解。 示例:

namespace :admin do
  get "/dash"

对比

namespace :admin do
  match "/dash" to "admin#dash"

对比

namespace...
  match "/dash" to "#dash"

第一个成功了,所以我可以通过控制器显示破折号,即 admin/dash 将由

控制
AdminController < ApplicationControler
  def dash
  end

第二个路由 admin/admin/dash 到 admin/dash 吗?

TL/DR: 我认为我的困惑来自语法或我对 RESTful 实践的理解不足,甚至可能是 ruby​​ 中的类/对象继承。

感谢您帮助这个 n00b。 :)

附带问题:我是否可以将我的代码更改为最小化,直到有人像剧透一样打开它,这样如果我找到更多信息并添加它就不会造成混乱?

【问题讨论】:

    标签: ruby-on-rails inheritance namespaces controller routes


    【解决方案1】:

    你想要的是路由中的“范围”。

    scope "/admin" do
      resources :articles
    end
    

    将 /admin/articles 路由到 ArticlesController(没有 Admin:: 前缀)

    文档几乎涵盖了所有可能的情况。 http://edgeguides.rubyonrails.org/routing.html

    【讨论】:

    • 如果您接受此批准,我认为您需要从 AdminController 中删除 Admin:: 命名空间
    【解决方案2】:

    我认为你最初的方法是正确的,但你需要稍微改变一下。

    1) 在命名空间内插入 /admin => /admin/dash(恕我直言,最好重定向它)

    match 'admin' => redirect('admin/dash')
    

    namespace :admin do
      match '/', to: 'admin#dash'
    end
    

    2) 您无法将 '/dash' 与 '#dash' 匹配,因为您不在 resource 块内,而是在 namespace 块内,所以它没有隐含的控制器。

    namespace :admin do
      match 'dash', to: 'admin#dash'
      # This will go to Admin::AdminController#dash
      # (first Admin because of the namespace,
      #  and the second because of the controller name)
    end
    

    希望它有效:D

    【讨论】:

    • 太棒了,这很好地解释了每个名字的作用!为什么更喜欢重定向?
    • 我不喜欢两个 URL 具有相同的功能,但这可能是因为我来自 SEO 世界。两种解决方案(无论是否重定向)都同样出色。
    • 我选一个会不会更好?
    • 你需要选择一个:)如果你使用redirect(),当你转到example.com/admin时,它会重定向到example.com/admin/dash,如果你使用匹配'/',example.com/admin会显示和example.com/admin/dash一样的内容
    • 啊,好的,谢谢!我最终只是重定向到/admin,感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2012-08-20
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多