如何在 Rails 5.2 中使用命名空间控制器根据对象 class 路由操作?

How to route actions based on object class with namespaced controllers in Rails 5.2?

我正在重构我的应用程序,以便现在在专用的管理命名空间中管理用户。我做了以下事情:

routes.rb

  namespace :administration do
    get 'users',           to: "/administration/users#index"
    resources :users
    resources :groups
  end

UsersGroups 控制器现在位于 app/controllers/administration 文件夹中。它们被定义为 Administration::UsersControllerAdministration::GroupsController。这些模型没有命名空间。

相关链接现在基于administration_users_pathadministration_groups_path.

我使用一些部分来协调布局。其中之一显示了 EditDelete 按钮,其中 this_object 代表传递给的实例当地人:

_object_actions.erb

<% if this_object.is_active %>

  <%= link_to [ :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 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 [ :activate, this_object], method: :post, class: "mat-stroked-button mat-button-base" do%>
    <span class="fa fa-trash-restore"></span>
    <%= t("Recall") %>
  <% end %>

<% end %>

但是对于用户和组,操作路径没有正确构建。我需要构建 URL 例如 /administration/users/1/edit,但它实际上是 /users/1/edit.

如何确保为此目的构建正确的 URL?

您可以为每个link_to

指定想要的路线
<%= link_to "Edit", edit_administration_user_path(this_object) %>

感谢这个 post Rails using link to with namespaced routes,我不明白可以向 link_to 方法添加更多参数来构建实际的 link.

为了调用命名空间控制器方法,我在 link 中添加了以下内容:

<%# Check if the parent is a module defined as Namespace. If not (Object) then display default link %>
<% namespace = controller.class.parent.name == 'Object' ? 
   nil : 
   controller.class.parent.name.downcase %>

<% if this_object.is_active %>
  <%= link_to [ :edit, namespace, 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 [namespace, 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 [ :activate,  namespace, this_object], 
      method: :post, 
      class: "mat-stroked-button mat-button-base" do %>
      <span class="fa fa-trash-restore"></span>
      <%= t("Recall") %>
  <% end %>

<% end %>