如何在 Rails 5.2 中根据带有命名空间控制器的对象类路由操作?

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

提问人:user1185081 提问时间:10/6/2021 更新时间:10/7/2021 访问量:127

问:

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

路由.rb

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

“用户”和“组”控制器现在位于 app/controllers/administration 文件夹中。它们被定义为 Administration::UsersController 和 Administration::GroupsController模型没有命名空间。

相关链接现在基于administration_users_pathadministration_groups_path

我使用一些部分进行 hamonised 布局。其中一个是 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?

Ruby-on-rails 命名空间

评论


答:

0赞 mcfoton 10/7/2021 #1

您可以为每个路由指定所需的路由link_to

<%= link_to "Edit", edit_administration_user_path(this_object) %>

评论

0赞 user1185081 10/7/2021
不幸的是,使用部分 I 可以处理各种模型和控制器,因此我无法对路径方法进行硬编码。
1赞 user1185081 10/7/2021 #2

多亏了这篇文章 Rails 使用 link to with namespaced routes,我不相信可以向 link_to 方法添加更多参数来构建实际的链接。

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

<%# 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 %>