我有一个应用程序,其中有一些顶级模型,全部正常工作。我的布局视图有一个标题部分,并且在导航栏上有主要的导航链接,这是非常标准的东西。现在我要添加一些新功能,因为稍后还会有更多功能,所以我决定将新模型和控制器封装在命名空间中以保持应用程序整洁。好吧,当我尝试第一个索引视图时,它不会加载。错误是
No route matches {:action=>"index", :controller=>"electrical/roles", :locale=>:en}
确实如此,到“角色”的路由不经过电气命名空间。评估标头部分时会生成该错误。该链接的 .erb 代码与我所有其他有效的视图相同。路径助手是否将名称空间添加到路径中,因为现在正在从该名称空间内的视图调用它?如果是这样,我如何路由出命名空间?或者更好的是,我可以告诉它不要弄乱我的路径,并且当我需要命名空间路径时我会明确告诉它吗?
在
/app/views/layouts/_header.html.erb
:
<% if current_user.has_role? :admin %>
<li class="nav-item">
<%= link_to t('role', scope: 'activerecord.models').pluralize,
roles_path,
class: ['nav-link', { active: current_page?(controller: 'roles') }],
aria: { label: t('role', scope: 'activerecord.models').pluralize } %>
</li>
<% end %>
在
/config/routes.rb
:
Rails.application.routes.draw do
scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
get 'site/home'
...
devise_for :users
resources :users, :only => [:show, :index]
resources :projects
resources :tags
resources :users, :only => [] do
resources :roles, :only => [:destroy]
end
resources :roles, :only => [:index, :new, :create]
namespace :electrical do
resources :cable_types
...
resources :cables
end
end
# Defines the root path route ("/")
root to: 'site#home'
end
最可能的罪魁祸首是
current_page?(controller: 'roles')
,它使用当前请求作为上下文,并且在以旧的非基于资源的方式使用时可能会给出一些意想不到的结果。
您可以通过传递一个字符串来避免这种情况 -
current_page?(roles_path)
。
参见: