如何在Rails 5.2中路由基于对象类的命名空间控制器的动作?



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

routes.rb

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

组和控制器现在在app/controllers/administration文件夹中。它们被定义为Administration::UsersController管理:GroupsController. 模型没有命名空间。

相关链接现在基于administration_users_pathadministration_groups_path.

我使用一些偏导数来协调布局。其中一个显示Edit删除按钮,其中this_object表示传递给local的实例:

_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 ?

多亏了这篇Rails使用link to与命名空间路由的文章,我明白了可以向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 %>

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

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

相关内容

  • 没有找到相关文章

最新更新