Rails 4 - 管理员编辑另一个用户的信息

时间:2015-11-15 20:25:16

标签: ruby-on-rails

我想要一个简单的系统,其中用户有三种类型(useradminmedic),标记为Admin的系统可以“激活”其他用户的帐户,他们可以访问某些特权。我尝试用一​​个简单的按钮来做这个,但我还没有找到办法。

代码的按钮是:

<%= button_to "Change user Type to Medic", :method=> "activate_medic" %>

我的激活方法如下:

def activate_medic
@user = User.find(params[:id])
@user.activated = true
if @user.save 
  flash[:info] = "Success"
end

我的post 'users/activate_medic'文件中有一个routes.rb。 但是,按下按钮会显示:

ActionController::RoutingError (No route matches [POST] "/users/1"):

如果我正在尝试修改用户1.

2 个答案:

答案 0 :(得分:0)

不完全是我在原始问题中提出的建议,但是: 我允许管理员用户完全编辑给定用户的信息,并通过代理他们的用户类型和权限:

用户控制器:

        before_action :correct_user,   only: [:edit, :update]        
        def correct_user
          @user = User.find(params[:id])
          redirect_to(root_url) unless current_user?(@user) || current_user.type == "Admin"
        end

但是,为了避免任何用户只是访问他们的编辑页面并给自己管理权限,我编辑了表单,只允许管理员查看编辑其类型的字段:

  <% if @user.type == "Admin" %>
    <%= f.label :type, "User Type:" %>
    <%= f.text_field :type, class: 'form-control' %>
  <% end %>

答案 1 :(得分:0)

link_to中的method选项用于指定HTTP谓词,而不是自定义方法的名称。根据您提供的内容,我会像这样处理问题:

button_to "Change user Type to Medic", activate_user_path(@user), method: :patch

专用控制器:

class ActivateUserController

  def update
    @user = User.find(params[:id])
    if @user.activate
      flash[:info] = "Success"
    end
    redirect_to @user
  end
end

一条路线:

resources :users do
  patch :activate, to: 'activate_user#update', as: :activate_user
end

最后,将用户行为转移到用户模型中:

class User 

  def activate
    self.update_attribute!(:active, true)
  end
end