【问题标题】:correct way to use routes.rb namespace rails?使用 routes.rb 命名空间 rails 的正确方法?
【发布时间】:2015-08-06 15:56:32
【问题描述】:

我正在尝试为我的应用程序创建一个后端区域,因此我在其中创建了一个名为 backend 和 backend_controller.rb 的文件夹。我需要该文件夹,因为后端区域将有多个文件夹,因此与其他文件夹更好地分开。

我的routes.rb 看起来像:

namespace :backend do
    get 'index'
end

我的backend_controller.rb

class BackendController < ApplicationController
  def index
  end
end

但在这种模式下,Rails 将在控制器文件夹中搜索我的backend_controller.rb,而不是在控制器>后端。我尝试了很多变体,但出现路由错误。

那么正确的方法是什么?将路径 /backend 设置为索引操作而不是 /backend/index?

谢谢


我做了什么:
基于所有答案,主要来自 Cyril DD

我在app/controller 文件夹中创建了backend_controller.rb,在子文件夹app/controller/backend 中创建了static_pages_controller.rb,所有文件如下所示:

app/controllers/backend_controller.rb

class BackendController < ApplicationController
end

app/controller/backend/static_pages_contter.rb

class Backend::StaticPagesController < BackendController
    def dashboard
    end
end

routes.rb

namespace :backend do
    resource :static_pages, path: '', only: [] do
        root to:'static_pages#dashboard'
end

这很好用,但是因为我是新手,所以我必须问一下。这是一种好的还是传统的方法?要管理用户可以在后端看到的权限,我使用backend_controller.rb 对吗?最后我必须使用resource: 而不是get ''

【问题讨论】:

  • 而不是在 routes.rb 中获取 'index' 定义资源后端或命名空间内的资源后端 :backend ... 取决于您的要求
  • 如果我这样做了,创建了 te 路由但找不到控制器,给出错误 uninitialize constant

标签: ruby-on-rails-4 routes


【解决方案1】:

回答您的问题

好的,namespace :somethingscope 'something', module: 'something', as: 'something' 的简写

现在您的声明非常模糊,因为您没有指定控制器。典型的声明看起来像(假设你有一个控制器 controllers/backend/some_resources_controller.rb 并且你想生成默认路由)

namespace :backend do
  resources :some_resources
end

现在你做了什么

namespace :backend
  get 'index'
end

真的很模棱两可,我并不惊讶它没有做你想做的事。基本上你只是告诉rails“查看子文件夹'backend'并定义路由'index'”。哦?我们甚至在谈论哪个文件/控制器?

你的backend_controller.rb 应该做什么?它是某种控制面板吗?仪表盘 ?如果是这样,您可能会有很多非 CRUD 操作,但无论如何您应该使用以下语法

namespace :backend
  # Below line of code will auto-generate the `index` for /backend/backend_controller
  resource :backend, only: [:index], path: '' do # we need " path: '' " otherwise we'll have https://xxx/backend/backend/dashboard
    # If you have non-CRUD actions, put them here !
    get 'dashboard' # https://xxx/backend/dashboard
    ...
  end
  # However, this will create URLs like "https://xxx/backend/dashboard", etc.
  # If you want to redirect https://xxx/backend/ to your backend_controller#index, use root
  root to: 'backend#index' # https://xxx/backend/
end

其他人提到的最后一件事,当您在 /backend/ 子文件夹中命名像 Backend_controller 这样的文件时,您必须重命名类,如 (/controllers/backend/backend_controller)

class Backend::BackendController < ApplicationController

备注:如果你只有一个或两个控制器动作,而不是使用resource方法,你可以声明单一资源

命名空间:后端做 根到:'后端#dashboard' get 'dashboard', to: 'backend#dashboard' # 单一资源 结束


一个你可能真正想做的例子......

我不确定您是否清楚自己想要做什么。例如,这是我的架构

文件

/controllers/application_controller.rb
/controllers/backend_controller.rb
/controllers/backend/static_pages_controller.rb
/controllers/backend/***.rb

/controllers/backend_controller.rb 类不会执行任何操作,但会覆盖 ApplicationController 以调整它以进行后端访问(但也许您不需要这样做)

class BackendController < ApplicationController
  # Do you need to change user_access method ? Or any other backend-wide config ?
  # If so put this config here, otherwise leave empty
end

现在对于 /backend/ 子文件夹中的每个文件,我都继承了 backend_controller

class Backend::StaticPagesController < BackendController
  def index
  end

  # Note : if your index is some kind of dashboard, instead I would declare
  def dashboard
  end
end

class Backend::SomeResourcesController < BackendController
  ...
end

路线

namespace :backend do
  root to 'static_pages#index' # https://xxxx/backend/
  resource :static_pages, only: [:index], path: '' # https://xxxx/backend/index
  resources :some_resources
end

如果您在控制器中选择仪表板解决方案,请改为:

namespace :backend do
  root to: static_pages#dashboard # https://xxxx/backend/
  resource :static_pages, path: '', only: [] do
    get 'dashboard' # https://xxxx/backend/dashboard
  end
  resources :some_resources
end

【讨论】:

  • 我的索引将像仪表板或管理员配置文件一样。所以我必须让/controllers/backend_controller.rb 路由覆盖application_controller,或者在application_controller 上创建一个动作,对吗?并将所有其他控制器放在更改类的后端文件夹中
  • 如果这样做,我有路径 /backend/static_pages/:static_page_id/dashboard(.:format) 所以我需要传递静态 _page_id 并且路径 mysite.com/backend 将不存在跨度>
  • 抱歉,resource 不是 resources ^^"。或者您可以保留此语法并添加 ,on: :collection。我将进行编辑。
  • 为了准确生成 https://xxx/backend/ 并将其重定向到您的控制器操作,您应该使用 root to: 'controller_name#action'(请参阅我的编辑)
【解决方案2】:

那就简单了

# routes.rb 
Rails.application.routes.draw do
  namespace :backend, shallow: true do
    resource :backend, path:''
  end
end

然后在您的app/controllers/backend/backend_controller.rb 中,它看起来像这样。

class Backend::BackendController < ApplicationController
  def index
  end
end

当我使用rake routes 时,它会显示

          Prefix Verb   URI Pattern                 Controller#Action
backend_backends GET    /backend(.:format)          backend/backends#index

希望这会有所帮助。

【讨论】:

  • 身份验证控制器从何而来??问题没有这样的要求
  • 好像他在尝试做嵌套控制器所以我给了他一个例子
  • 实际上我希望我的路线看起来像 /backend 而已。我只想访问 mysite.com/backend 并访问后端的索引页面。并且控制器必须在 app>controllers>backend> backend_controller.rb
  • 如果我这样做,我会收到错误“未初始化的常量 Backend::BackendsController”,并且路由路径错误,例如:'backend/backends#create',并且没有索引路由
  • 更新了我的答案以进一步反映您的需求。我在本地环境中重新创建了它,并且上面的代码可以正常工作。
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2018-11-27
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多