我应该链接到像这样的控制器动作吗?

时间:2015-05-27 14:21:55

标签: ruby-on-rails

在我的应用程序中,我有一个用户,其数据库中的表包含管理状态的布尔列。我希望管理员能够更改任何其他用户的管理状态。相关观点是:

rule :newline

我不知道该怎么做,所以我通过连接用户的ID和特定查询拼凑了URL。我的控制器从限制开始,似乎可以防止未经授权访问这些方法:

<% @users.each do |user| %>
  <tr>
    ...
    <% if current_user && (current_user.id == user.id || current_user.admin) %>
      ...
      <% if current_user.admin %> 
        <td><%= link_to 'Make admin', user.id.to_s + '/make_admin', {:method => 'post', :action => 'make_admin'} %></td>
        <% if user.admin %>
        <td><%= link_to 'Revoke admin', user.id.to_s + '/revoke_admin', {:method => 'post',  :action => 'revoke_admin'} %></td>
        <% end %>
      ...
  </tr>
<% end %>

最后,我的路由文件如下所示:

class UsersController < ApplicationController
  ...
  before_action :admin_logged_in, only: [:edit, :update, :destroy, :make_admin, :revoke_admin]

它似乎有用,但我想知道是否有更好的方法来做到这一点。我已经阅读了Rails上的路由指南,但现在对我来说很少有意义。我已经尝试使用

直接链接到用户
Rails.application.routes.draw do
  ...

  post ':id/make_admin' => 'users#make_admin'
  post ':id/revoke_admin' => 'users#revoke_admin'

但是我会收到一个错误,关于没有为[POST] / user_id定义路由或沿着这些行的东西。在这种情况下,感觉就像是更好的解决方案;如果是的话,我应该在routes.rb文件中做些什么来解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以按如下方式创建路线:

resources :users do 
   member do 
     post 'make_admin', as: :make_admin
     post 'revoke_admin', as: :revoke_admin
   end
end

我希望这可以帮助你

答案 1 :(得分:0)

您可以像这样在路线中添加帮助:

post ':id/make_admin' => 'users#make_admin', as: 'make_admin'

现在make_admin_path(user.id)将链接到该链接。您可以通过在您网站的目录中运行rake routes或转到localhost:3000/rails/info

来查看所有帮助程序

至于你得到的错误,我不能肯定地说没有看到完整的错误,但当你<%= link_to 'text', user %> ruby​​在路径上解释user并试图找到{{1}时并且user_path是添加的HTML属性的哈希值。