允许用户在Devise中添加新用户,并保持自己登录

我使用Ruby On Rails与Devise,Rails 4.1.0.rc1,Ruby 2.1.0p0,devise-3.2.4

我按照Rails Cast Episode#209的教程来安装和使用设计。 我可以登录并注销并注册新用户。

我扩展了我的用户模型,以包含生日,名字和姓氏等不变信息。

在这篇博客文章之后,我添加了一个用户控制器和视图,以便添加其他function,例如我没有用设计看到的所有用户的列表。 https://github.com/danweller18/devise/wiki/Allow-Users-to-View-Profile-and-List-All-Users

我还回顾了关于堆栈溢出的这些问题: 允许管理员使用Devise添加用户 如何在Devise中自定义控制器以进行注册? Ruby on Rails:自定义设计注册控制器,请求创建操作

从今年3月1日开始,我是ruby on rails的新手,并参加了Mike&Nicole Clarks Rails 1&Rails 2在线课程。

我想要做的是允许用户添加新用户。 最终,此function将是添加客户端的管理员或经理。 然后,客户端应该能够使用创建的凭据登录。

发生的事情是我可以登录,通过new_user_path和用户视图添加新的“用户”(而不是设计视图),但是当我提交它时,我将以新用户身份登录。 以前的用户不是持久的。

我通过用户视图和控制器操作执行所有这些操作,因为我不想实际“注册”或使用这些操作登录和注销,只需在用户表中创建新记录,然后就可以登录到他们的拥有。

任何帮助表示赞赏。

这是我的用户控制器:

class UsersController < ApplicationController def index @users = User.all end def show @user = User.find_by_id(params[:id]) end def new @user = User.new end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if @user.update_attributes(user_params) redirect_to user_url, notice: "Updated User." else render :edit end end def create @user = User.new(user_params) if @user.save redirect_to user_url, notice: "User succesfully created!" else render :new end end private def user_params params.require(:user).permit(:first_name, :last_name, :img_file_name, :email, :password, :password_confirmation, :birthdate) end end 

这是我的应用程序控制器:

 class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:account_update) {|u| u.permit(:first_name, :last_name, :birthdate, :img_file_name, :email, :password, :password_confirmation, :current_password)} devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:first_name, :last_name, :birthdate, :img_file_name, :email, :password, :password_confirmation, :current_password)} end end 

这是我的用户new.html.erb文件:(管理员现在只是提醒我,他们当时没有管理function)

 

Create a New User (Admins Only)

这是_form.html.erb

   



我认为问题实际上是你的路线。 我想你已经添加了resources :users到你的路由文件来为你的UsersController设置路由。 但是,我猜你也有devise_for :users …来设置设计。 这意味着您将设计并且您的UsersController争夺相同的路线。 具体来说,您期望POST / users用于创建新用户,但它实际上路由到设计的RegistrationsController并注册新用户并签名。

您可以通过运行rake routes并看到设计和您的UsersController都有例如POST /users(.:format)映射来看到这POST /users(.:format) 。 您需要将两组路线分开。 有多种方法可以做到这一点。 你可以在routes.rbdevise_for行添加:path => 'u' ,这意味着你的设计路线全部是/u而不是/users 。 或者,您可以在/users上保留设计路由,而是将UsersController路由更改为:

 resources :users_admin, :controller => 'users' 

/users_admin映射到您的UsersController(但请注意,路径助手也将从例如users_path更改为users_admin_path )。

这是我最终解决这个问题的方法

在routes.rb中

  devise_for :users resources :users_admin, :controller => 'users' 

在users_controller.rb中没有任何变化

在form.html.erb中添加新用户和更新用户。 请注意指定的URL。 这在某种程度上是在这里记录的,但只提到它用于单一资源http://guides.rubyonrails.org/routing.html

但是我不得不将编辑和新路径分开,因为url在同时创建和更新都不起作用,因此我只有2个表单而不是渲染部分。 不确定解决方法是什么。

这是我的新用户表单:

 <%= form_for @user, url: users_admin_index_path(@user) do |f| %> 

这个是在我的编辑用户表单中:

 <%= form_for @user, url: users_admin_path(@user) do |f| %> 

在表单的底部我有这个代码:

  <% if @user.new_record? %> <%= f.submit "Create Account" %> <% else %> <%= f.submit "Update Account" %> <% end %> <%= link_to "Cancel", users_admin_index_path, class: 'button' %>  

然后在show.html.erb表单中我必须从’rake routes’指定URLS

 

我从rake路线获得了路径名称。

我希望这有助于其他人,并感谢大家的帮助。 我还没有足够的声誉来支持任何答案。

正如我理解你的问题(文本部分,而不是阅读代码),你希望用户添加其他用户,并且帐户应该可以使用了。 要使用devise注册,您将使用用户email, password and password_confirmation field as mandatory

使用电子邮件注册用户时,请为帐户提供虚拟密码,以便保存用户条目。 使用密码重置链接向用户发送邮件以确认其帐户并更改密码。

GhostRider在工作流程上是正确的。 您也可以将逻辑移动到AdminsController或类似的。 该线程将解决以该用户身份登录的具体问题: 设计:如何创建已登录的新用户?

但是,让管理员设置临时密码并通过电子邮件通知新用户让他们完成创建帐户是一个更好的工作流程。