У меня есть приложение Rails 3 с настройкой аутентификации с использованием Разработка с включенным модулем registerable
.
Я хочу, чтобы новые пользователи, зарегистрировавшиеся с помощью нашей внешней регистрационной формы, использовали полный модуль Devise registerable
, что происходит сейчас.
Однако я также хочу, чтобы пользователь admin
мог создавать новых пользователей напрямую, минуя (я думаю) модуль registerable
Devise.
При отключенном registerable
мой стандартный UsersController работает так, как я хочу, для пользователя admin
, как и любой другой эшафот Rail. Однако теперь новые пользователи не могут зарегистрироваться самостоятельно.
При включенном registerable
мой стандартный UsersController никогда не вызывается для нового пользовательского действия (вместо этого вызывается Devise::RegistrationsController
), и мои действия CRUD, похоже, не работают вообще (меня сбрасывают обратно на мой корневая страница без создания нового пользователя и без флеш-сообщения). Вот журнал из запроса:
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"=>"test@test.com", "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
... но я могу зарегистрировать новых пользователей через внешнюю форму.
Как заставить оба этих метода работать вместе, чтобы мой пользователь admin
мог вручную создавать новых пользователей и гостевые пользователи могут зарегистрироваться самостоятельно?
У меня установлен пользовательский контроллер для стандартного CRUD:
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
И мои маршруты настроены следующим образом:
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