【问题标题】:How to use the admin/ route properly?如何正确使用管理员/路由?
【发布时间】:2017-02-21 16:31:49
【问题描述】:

我正在尝试制作一个具有公共区域和管理仪表板的应用程序。

对于公共区域,我只使用了一个名为 Public 的控制器,并且为此使用了很多视图。每个视图都是我前端的一个区域,位于 views/public 文件夹下。它们是联系方式、关于我们等页面。但最后,我不想在我的网址上出现 public 字样。我只想访问类似的东西:http://localhost:3000/contact 并去正确的地方。此联系人视图中的表单也是如此。

我还有另一个管理员问题。首先,我创建了 Admin 控制器,它的视图:index、loginlogout。之后,我做了一个 Events 控制器,其中包含以下视图:index、new、edit、show、delete、destroy 和 update

所以,我不知道我的想法是否正确,但是在搜索了这个主题之后,我为事件控制器做了一个这样的范围路由:

scope module: 'admin', path: 'admin' do
    resources :events do    
        member do
            get :delete
          end
      end
  end

我必须将事件视图放在文件夹 views/admin 下,然后更改控制器类名称,将 Admin:: 放在它们的名称之前。此外,控制器 AdminEvents 现在位于文件夹 controllers/admin 下。

Events 控制器及其视图似乎工作正常。甚至 CRUD 网址。但我不知道如何将 Admin 控制器路由置于 admin 范围 之下。 我的目的是制作这样的网址:http://localhost:3000/admin/ 它应该带我去:admin/admin#index

我也尝试将 Admin 路由置于 admin 范围内,但没有成功。是这样的:

scope module: 'admin', path: 'admin' do
    get 'admin/index'
    get 'admin/login'
    get 'admin/logout'
    resources :events do    
        member do
            get :delete
          end
      end
  end

我也试过这个:

scope module: 'admin', path: 'admin' do
    get 'index'
    get 'login'
    get 'logout'
    resources :events do    
        member do
            get :delete
          end
      end
  end

也没有用。我对这条路线的想法是否正确?如果没有,我错过了什么?

【问题讨论】:

  • 对于非命名空间,非admin/admin,只是admin/controllers/admin_controller.rb,使用controller :admin do; get 'admin/', action: :index; end

标签: ruby-on-rails


【解决方案1】:

你需要告诉哪个控制器应该处理indexloginlogout...

如果你想要一个像 Admin::AdminController 这样的命名空间的 AdminController,你可以这样做

namespace :admin do
  controller :admin do
    get '/', action: :index
    get :login
    get :logout
  end
  resources :events
end

它将生成这些路线

          Prefix Verb   URI Pattern                      Controller#Action
           admin GET    /admin(.:format)                 admin/admin#index
     admin_login GET    /admin/login(.:format)           admin/admin#login
    admin_logout GET    /admin/logout(.:format)          admin/admin#logout
    admin_events GET    /admin/events(.:format)          admin/events#index
                 POST   /admin/events(.:format)          admin/events#create
 new_admin_event GET    /admin/events/new(.:format)      admin/events#new
edit_admin_event GET    /admin/events/:id/edit(.:format) admin/events#edit
     admin_event GET    /admin/events/:id(.:format)      admin/events#show
                 PATCH  /admin/events/:id(.:format)      admin/events#update
                 PUT    /admin/events/:id(.:format)      admin/events#update
                 DELETE /admin/events/:id(.:format)      admin/events#destroy

【讨论】:

  • 成功了。但是对于管理区域,我不得不将我的 Admin 控制器的所有视图移动到文件夹 views/admin/admin。包含的布局文件。所以,现在,在我的 Events 控制器上,我必须像这样调用布局:layout "admin/admin"。保持这样可以吗?
  • 即使有命名空间,当你更改布局文件时,rails 搜索布局文件的默认位置是 views/layout... (对于views/layout/admin.html.erb)如果您将布局文件放在其他位置,只需设置正确的位置...渲染它添加layout :admin
  • 好的@cefigueiredo,我将它移回视图/布局及其工作,但不在我的控制器Admin上。我必须把 layout "admin" 行放在那里以使其工作。但为什么?控制器不会自动搜索有他名字的布局?
  • No... 已在ApplicationController 继承的ApplicationController::Base 上设置了默认值,即application 指向views/layouts/application.html.erb 你只需要设置布局,如果你不想要使用默认值。与控制器名称反应的唯一模板是用于操作和部分...索引、显示、编辑...但它们的行为就像在布局内呈现的部分...
  • 知道了。感谢@cefigueiredo 的帮助!
【解决方案2】:

指定您的公共路线

get "/contact",       to: "public#contact",       as: :contact

分离你的管理路线:

namespace :admin do 
    get  :login,    to: "admin#login"
    post :logout,   to: "admin#logout"
    root "admin#root"
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多