问题 Rails :(设计)新用户有两种不同的方法吗?


我有一个Rails 3应用程序使用身份验证设置 设计 随着 registerable 模块已启用。

我希望让使用我们的外部注册表单注册的新用户使用完整的Devise registerable 模块,现在正在发生。

但是,我也想要 admin 用户能够直接创建新用户,绕过(我认为)Devise的 registerable 模块。

  • registerable 禁用,我的标准UsersController工作正如我想要的那样 admin 用户,就像任何其他铁支架一样。但是,现在新用户无法自行注册。

  • 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

12663
2017-12-20 16:55


起源



答案:


您应该创建一个单独的控制器来管理您的用户。我总是创建管理员用户并为他们提供一个特殊的命名空间。让我说明一下:

config/routes.rb

devise :users # Allow users to register here

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

12
2017-12-21 13:50



咄!那是我正在寻找的秘诀。解决了这么多问题...请原谅我,一边把头撞到墙上。谢谢。 - neezer
如何在控制器中提供命名空间? - Anil D
这里有关于如何在Rails中使用命名空间的更多细节。您需要在app> controllers中创建一个文件夹 - 在此示例中,您将在controllers文件夹中放置一个新文件夹admin,然后将新用户控制器放在那里。然后可以通过applcom / admin / users访问这些文件 - guides.rubyonrails.org/... - william tell


答案:


您应该创建一个单独的控制器来管理您的用户。我总是创建管理员用户并为他们提供一个特殊的命名空间。让我说明一下:

config/routes.rb

devise :users # Allow users to register here

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

12
2017-12-21 13:50



咄!那是我正在寻找的秘诀。解决了这么多问题...请原谅我,一边把头撞到墙上。谢谢。 - neezer
如何在控制器中提供命名空间? - Anil D
这里有关于如何在Rails中使用命名空间的更多细节。您需要在app> controllers中创建一个文件夹 - 在此示例中,您将在controllers文件夹中放置一个新文件夹admin,然后将新用户控制器放在那里。然后可以通过applcom / admin / users访问这些文件 - guides.rubyonrails.org/... - william tell


您需要在routes.rb中添加此配置

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

然后像这样实现你自己的注册控制器

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

  ## other actions 
end

然后你可以写自己的观点 如果你的覆盖设计的默认控制器,也许你会失去一些功能,例如验证。你需要自己实现它们


0
2018-02-23 04:25