使用Rails 3.1.3和Devise 1.5.3。我的应用有帐户和用户。每个帐户可以拥有多个用户。用户可以拥有一个角色“user”或“account_admin”。将signup
路由设计为accounts#new
。帐户和初始account_admin用户同时创建。按照here描述的那样工作(尽管从那以后事情已经发展了一些)。
account_admin标志应该能够在该帐户中创建其他用户。这就是我遇到麻烦的地方:它不是创建新用户,而只是重定向到user_path
(用户#show)页面,并显示消息“你已经登录了”。 (user_path
是我被覆盖的after_sign_in_path
。)
这article提出了类似的问题。答案为管理员提供了一个单独的命名空间,但由于管理员是我常规应用程序的一部分,我认为不适用。
我已经定义了一个完整的UsersController。根据日志,GET "/users/new"
从我的“UsersController #new”呈现。但是,POST "/users"
被Devise拦截并从“Devise :: RegistrationsController #create”中呈现。
配置/ routes.rb中
devise_for :users
devise_scope :user do
get "signup", :to => "accounts#new"
get "signin", :to => "devise/sessions#new"
get "signout", :to => "devise/sessions#destroy"
end
resources :users
resources :accounts
应用程序/控制器/ users_controller.rb
class UsersController < ApplicationController
before_filter :authenticate_user!
load_and_authorize_resource # CanCan
...
def new
# CanCan: @user = User.new
end
def create
# CanCan: @user = User.new(params[:user])
@user.skip_confirmation! # confirm immediately--don't require email confirmation
if @user.save
flash[:success] = "User added and activated."
redirect_to users_path # list of all users
else
render 'new'
end
end
...
end
我已经尝试overriding the Devise controller,如果用户已经登录,我可以告诉它使用我的users#create
操作。日志告诉我它正在使用我的控制器(“Registration by RegistrationsController#创建为HTML“),但它似乎没有执行其代码。我已经注释掉了我的自定义操作,只是留在了记录器行中,但我没有收到记录消息。尽管super
被注释掉了,但行为并没有改变 - 它仍然会重定向为“你已经登录了。”
配置/ routes.rb中
devise_for :users, :controllers => {:registrations => "registrations"}
应用程序/控制器/ registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
def new
logger.info "Custom RegistrationsController: new"
super
end
def create
logger.info "Custom RegistrationsController: create"
# super unless user_signed_in?
# render "users#create"
end
def update
super
end
end
我错过了什么?如何让account_admin用户创建其他用户?
答案 0 :(得分:1)
主要问题是Devise正在拦截POST "/users"
(以及其他一些路线)。找到此解决方法以允许我的Users控制器处理这些路由:更改devise_for
以跳过注册,然后添加回Devise通常定义别名的路由:
<强>的routes.rb 强>
devise_for :users, :skip => [:registrations]
devise_scope :user do
get "signup", :to => "accounts#new"
get "signin", :to => "devise/sessions#new"
get "signout", :to => "devise/sessions#destroy"
get "cancel_user_registration", :to => "devise/registrations#cancel"
post "user_registration", :to => "users#create"
get "new_user_registration", :to => "accounts#new"
get "edit_user_registration", :to => "users#edit"
end
resources :users
resources :accounts
从未弄清楚为什么Devise控制器覆盖不起作用。
this thread上的用户指出了devise_invitable宝石,这可能是一个有趣的选择。
答案 1 :(得分:0)
这就是我最终使用我的设置(Devise绑定到我的用户模型 - 没有单独的编辑/管理模型)的方式:
class UsermakersController < ApplicationController
before_action :authenticate_user!
def new
@user = User.new
end
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to users_path, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render users_path }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
private
def user_params
userParams = params.require(:user).permit(:name, :email)
end
end
从这里开始,当您想要将新用户添加为另一个用户时,只需在表单中调用Usermakers#new url,例如,我在用户索引页的底部显示:
<%= link_to 'Add User', new_usermaker_path, id: 'new_user_link' %>
用户制作者表格如下:
= simple_form_for @user, url: usermakers_path, html: {multipart: true} do |f|
=f.error_notification errors: true
= f.input :name
= f.input :email
%p
= f.button :submit, 'Create User', class: 'button'
当然,您需要添加一个虚拟的new.html.erb文件,该文件只是呈现_form.html.erb来使用它。
只需将新方法和创建方法添加到routes.rb文件(无论是resources :usermakers
还是更具体的路线),您应该好好去。希望这有帮助!