【发布时间】:2012-02-02 19:56:43
【问题描述】:
将 Rails 3.1.3 与 Devise 1.5.3 结合使用。我的应用程序有帐户和用户。每个帐户可以有多个用户。一个用户可以有一个角色,“user”或“account_admin”。设计signup 路由到accounts#new。帐户和初始 account_admin 用户是同时创建的。按照here 的描述得到了这个工作(尽管从那时起事情已经发展了一些)。
account_admin 标志应该能够在该帐户中创建其他用户。这就是我遇到麻烦的地方:它不是创建新用户,而是重定向到 user_path (users#show) 页面,并显示消息“您已经登录”。 (user_path 是我覆盖的 after_sign_in_path。)
这个article 提出了类似的问题。答案建议为管理员使用单独的命名空间,但由于管理员是我常规应用程序的一部分,我认为这不适用。
我已经定义了一个完整的用户控制器。根据日志,GET "/users/new" 从我的“UsersController#new”渲染。但是 POST "/users" 被 Devise 拦截并从“Devise::RegistrationsController#create”渲染。
config/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
app/controllers/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 操作。日志告诉我它正在使用我的控制器(“由 RegistrationsController 处理#create as HTML” ),但它似乎没有执行它的代码。我已经注释掉了我的自定义操作,只是留在了记录器行中,但我没有收到我的记录消息。尽管super 被注释掉了,但行为并没有改变——它仍然会重定向为“您已经登录”。
config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
app/controllers/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 用户创建其他用户?
【问题讨论】: