我想要一个简单的系统,其中用户有三种类型(user
,admin
和medic
),标记为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.
答案 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