2012-02-02 45 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還是更具體的路線),並且您應該很好。希望這可以幫助!

相關問題