2010-12-20 20 views
11

Tengo una aplicación Rails 3 con configuración de autenticación usando Devise con el módulo registerable habilitado.Rails: (Devise) ¿Dos métodos diferentes para nuevos usuarios?

Quiero tener nuevos usuarios que se registren utilizando nuestro formulario de registro externo para usar el módulo completo registerable Devise, que está sucediendo ahora.

Sin embargo, también quiero que el usuario admin pueda crear nuevos usuarios directamente, omitiendo (creo) el módulo registerable de Devise.

  • Con registerable discapacitados, mi UsersController estándar funciona como yo quiero que para el usuario admin, al igual que cualquier otro andamio carril. Sin embargo, ahora los nuevos usuarios no pueden registrarse por sí mismos.

  • Con registerable habilitado, mi UsersController estándar nunca se llama a la nueva acción del usuario (llamando Devise::RegistrationsController en su lugar), y no parecen mis acciones CRUD trabajar en absoluto (I consigue descargado de nuevo en mi página de raíz con ningún nuevo usuario creado y sin mensaje flash). Aquí está el registro de la solicitud:

    Started POST "/users" for 127.0.0.1 at 2010-12-20 11:49:31 -0500 
    Processing by Devise::RegistrationsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"18697r4syNNWHfMTkDCwcDYphjos+68rPFsaYKVjo8Y=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "role"=>"manager"}, "commit"=>"Create User"} 
    SQL (0.9ms) ... 
    
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 2) LIMIT 1 
    SQL (0.9ms) ... 
    
    Redirected to http://test-app.local/ Completed 302 Found in 192ms 
    

... pero yo soy capaz de registrar nuevos usuarios a través de la forma exterior.

¿Cómo puedo obtener tanto de estos métodos para trabajar juntos, de manera que mi usuario admin puede crear manualmente nuevos usuarios y usuarios invitados pueden inscribirse por su cuenta?


tengo mi configuración de controlador de Usuarios para CRUD estándar:

class UsersController < ApplicationController 
    load_and_authorize_resource 

    def index 
    @users = User.where("id NOT IN (?)", current_user.id) # don't display the current user in the users list; go to account management to edit current user details 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     flash[:notice] = "#{ @user.email } created." 
     redirect_to users_path 
    else 
     render :action => 'new' 
    end 
    end 

    def edit 
    end 

    def update 
    params[:user].delete(:password) if params[:user][:password].blank? 
    params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank? 
    if @user.update_attributes(params[:user]) 
     flash[:notice] = "Successfully updated User." 
     redirect_to users_path 
    else 
     render :action => 'edit' 
    end 
    end 

    def delete 
    end 

    def destroy 
    redirect_to users_path and return if params[:cancel] 
    if @user.destroy 
     flash[:notice] = "#{ @user.email } deleted." 
     redirect_to users_path 
    end 
    end 

end 

Y mi configuración de rutas de la siguiente manera:

TestApp::Application.routes.draw do 

    devise_for :users 

    devise_scope :user do 
    get "/login", :to => "devise/sessions#new", :as => :new_user_session 
    get "/logout", :to => "devise/sessions#destroy", :as => :destroy_user_session 
    end 

    resources :users do 
    get :delete, :on => :member 
    end 

    authenticate :user do 
    root :to => "application#index" 
    end 
    root :to => "devise/session#new" 

end 

Respuesta

12

Debe crear un controlador separado para administrar sus usuarios. Siempre creo usuarios administradores y darles un espacio de nombres especial para trabajar en Permítanme ilustrar que:.

config/routes.rb

devise :users # Allow users to register here 

namespace :admin do 
    resources :users # Have the admin manage them here. 
end 
+3

Duh! Esa era la salsa secreta que estaba buscando. Resuelve tantos problemas ... discúlpame mientras golpeo mi cabeza contra la pared. Gracias. – neezer

+0

¿Cómo dar espacio de nombres en el controlador? –

+0

Aquí hay un poco más de detalles sobre cómo usar espacios de nombres en Rails.Necesitarás crear una carpeta en la aplicación> Controladores: en este ejemplo, colocarías un nuevo administrador de carpeta en la carpeta Controladores y luego pondrás tu nuevo controlador de usuario allí. Los archivos deben ser accesibles a través de applcom/admin/users - http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing –

0

necesita añadir esta configuración en el routes.rb

devise_for :users, :controllers => {:registrations => "users/registrations" } 

entonces implementar su propio controlador de registro como esto

class Users::RegistrationsController < Devise::RegistrationsController 
    def new 
    ... 
    end 

    ## other actions 
end 

luego puede escribir sus propias vistas si anula su controlador predeterminado, tal vez perderá alguna función, p. validaciones. necesita implementarlos usted mismo

Cuestiones relacionadas