如何在 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
Users 和 Groups 控制器现在位于 app/controllers/administration 文件夹中。它们被定义为 Administration::UsersController 和 Administration::GroupsController。这些模型没有命名空间。
相关链接现在基于administration_users_path和administration_groups_path.
我使用一些部分来协调布局。其中之一显示了 Edit 和 Delete 按钮,其中 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 %>
我正在重构我的应用程序,以便现在在专用的管理命名空间中管理用户。我做了以下事情:
routes.rb
namespace :administration do
get 'users', to: "/administration/users#index"
resources :users
resources :groups
end
Users 和 Groups 控制器现在位于 app/controllers/administration 文件夹中。它们被定义为 Administration::UsersController 和 Administration::GroupsController。这些模型没有命名空间。
相关链接现在基于administration_users_path和administration_groups_path.
我使用一些部分来协调布局。其中之一显示了 Edit 和 Delete 按钮,其中 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 %>