Rails 5.2带Administration命名空间的控制器如何基于对象类生成正确路由
问题原因
路由生成异常是因为Rails多态路由默认会根据模型类名匹配路由,你的User、Group模型没有加Administration命名空间,所以生成路径时不会自动带上/administration前缀。
解决方案1(最推荐,无副作用)
直接在路由数组的最前面加上命名空间标识:administration,修改你的_object_actions.erb代码如下:
<% if this_object.is_active %> <%= link_to [:administration, :edit, this_object], method: :get, class: "mat-flat-button mat-button-base mat-primary" do%> <span class="fa fa-edit"></span> <%= t("Edit") %> <% end %> <%= link_to [:administration, this_object], data: { confirm: t("Sure") }, method: :delete, class: "mat-flat-button mat-button-base mat-warn" do%> <span class="fa fa-trash"></span> <%= t("Destroy") %> <% end %> <% else %> <%= link_to [:administration, :activate, this_object], method: :post, class: "mat-stroked-button mat-button-base" do%> <span class="fa fa-trash-restore"></span> <%= t("Recall") %> <% end %> <% end %>
同时需要在routes.rb中补充activate动作的成员路由,并且删掉多余的users index路由声明(resources已经自动生成了index路由):
namespace :administration do resources :users do post :activate, on: :member end resources :groups do # 如果groups也需要激活功能,同样加这行 post :activate, on: :member end end
解决方案2(全局生效,适合管理后台独用的模型)
如果你确定整个应用里User、Group模型的路由都要走administration命名空间,可以直接修改模型类的路由映射规则,不需要改动视图代码:
class User < ApplicationRecord # 告诉路由生成器这个模型对应administration命名空间下的users资源 def self.model_name ActiveModel::Name.new(self, nil, "Administration/User") end end # Group模型同理做相同修改
这种方法不推荐混用前台、后台路由的场景,会导致前台路由生成也带上administration前缀。
内容的提问来源于stack exchange,提问作者user1185081
相关产品推荐
相关产品推荐

