2012-02-02 46 views
1

使用Rails 3.1.3和Devise 1.5.3。我的应用有帐户和用户。每个帐户可以有多个用户。用户可以有一个角色,“用户”或“account_admin”。设计signup路线到accounts#new。该帐户和初始account_admin用户同时创建。按照here的描述得到了这个工作(尽管事情自那时起已经发展了一些)。账户和用户的应用程序 - 设计用户无法创建其他用户

account_admin标志应该能够在该帐户中创建其他用户。这就是我遇到麻烦的原因:它不是创建新用户,而是重定向到user_path(users#show)页面,并显示消息“您已经登录”。 (user_path是我被覆盖的after_sign_in_path。)

这个article问了一个类似的问题。答案为管理员建议了一个单独的名称空间,但由于管理员是我的常规应用程序的一部分,我不认为这适用。

我已经定义了一个完整的UsersController。根据日志,GET "https://stackoverflow.com/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 

应用程序/控制器/ 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行动,如果用户已经登录。日志告诉我它正在使用我的控制器(“Processing by RegistrationsController#create as HTML”),但它似乎没有执行它的代码。我已经注释掉了我的自定义操作,只留在记录器行中,但我没有收到日志消息。尽管super被注释掉了,但行为不会改变 - 它仍然会重定向到“您已经登录”。

的config/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用户创建更多用户?

回答

1

主要问题是Devise正在拦截POST "/users"(和其他几条路线)。发现此解决办法,让我的用户控制器处理这些路线:改变devise_for跳过注册,然后重新添加在路线设计其通常定义别名:

的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 

也想不到为什么设计控制器覆盖不起作用。

this thread上的用户指出了devise_invitable宝石,这可能是一个有趣的选择。

0

这是我怎么会得到这个与我的设置工作(设计绑在我的用户模型 - 没有单独的编辑器/管理模型):

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在你的形式,例如#新的URL,我有这个在我的用户索引页面的底部:

<%= link_to 'Add User', new_usermaker_path, id: 'new_user_link' %> 

而且Usermakers形式如下:

= 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还是更具体的路线),并且您应该很好。希望这可以帮助!

相关问题