我正在使用rails 4.0.2,设计和cancancan。我正在尝试允许管理员创建新用户。管理员用户在users表中分配了一个布尔字段。
在ability.rb中我有以下内容:
can :manage, :all if user.admin?
根据this问题中的一些建议,我创建了一个名为AdminsController的新控制器,它看起来像这样:
class AdminsController < Devise::RegistrationsController
def create
build_resource(sign_up_params)
if resource.save
redirect_to admin_editors_path
else
clean_up_passwords resource
respond_with resource
end
end
def new
build_resource({})
end
end
我也试过配置路线:
devise_for :users, :skip => [:registrations]
as :user do
get 'user/admin' => 'admins#new'
post 'user/admin' => 'admins#create'
get 'users/edit' => 'devise/registrations#edit', :as => :edit_user_registration
post 'users/' => 'devise/registrations#create', :as => :user_registration
get 'users/cancel' => 'devise/registrations#cancel', :as => :cancel_user_registration
end
在devise / registrations / edit.html中我试图添加一个链接,允许用户像这样创建一个新用户:
<%= link_to "Create User", user_admin_path %>
问题是该链接只是将我重定向到带有消息的主页
您已登录。
我不确定我在这里遇到了什么问题,所以任何帮助都会非常感激。
答案 0 :(得分:0)
Devise :: RegistrationsController中的build_resource
方法(在github上),
def build_resource(hash=nil)
self.resource = resource_class.new_with_session(hash || {}, session)
end
通过基于会话构建新资源。会话中的用户(在本例中)是管理员并已登录。
您希望基于用户类的新用户实例创建新用户,而不是基于会话。
这样的事情应该有效。
class AdminsController < ApplicationController
def new_user
authorize! :manage, User
@user = Users.new
end
def create_user
@user = User.new(permitted_params.user)
authorize! :manage, User
if @user.save
#success
else
#error
end
end
end
的routes.rb
get "admins/new_user" => "admins#new_user", as: :admins_new_user
post "admins/create_user/:id" = "admins/create_user", as: :admins_create_user
链接到新用户
<%= link_to "Create User", admins_new_user_path %>
表格
<%= form_for(@user, :url => admins_create_user_path) do |f| %>
#fields and submit
<% end %>
allowed_params.user是PermittedParams类中的一个方法,对您来说可能很方便。
通过将current_user传递给方法,您可以为不同的用户提供不同的参数。
模型/ permitted_params.rb
class PermittedParams < Struct.new(:params, :current_user)
def user
params.require(:user).permit(*user_attributes)
end
def user_attributes
if current_user.admin?
[:name, :email,:password, :password_confirmation, :role ,:admin]
else
[ :name, :email, :remember_me,:password, :password_confirmation, ]
end
end
end