提问人:user1185081 提问时间:10/6/2021 更新时间:10/7/2021 访问量:127
如何在 Rails 5.2 中根据带有命名空间控制器的对象类路由操作?
How to route actions based on object class with namespaced controllers in Rails 5.2?
问:
我正在重构我的应用程序,以便用户现在在专用的 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_path和administration_groups_path。
我使用一些部分进行 hamonised 布局。其中一个是 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?
答:
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 %>
上一个:RoR 路由的命名空间设置
评论