【问题标题】:Create new user programmatically with Devise使用 Devise 以编程方式创建新用户
【发布时间】:2013-07-16 16:09:56
【问题描述】:

我正在使用 Devise 来管理我的 rails 应用程序中的用户。我有一个可供管理员用户使用的按钮,该按钮会导致一个允许他们创建其他管理员用户帐户的表单。

当表单被提交时,这个代码被调用:

@user = User.new(:email => params[:email], :password => params[:password], :password_confirmation => params[:password_confirmation])
@user.admin = true
@user.save

它似乎无法正常工作,因为当我退出并尝试使用新的管理员帐户登录时它失败了。我猜上面的代码不是用 Devise 创建新用户的正确方法。

编辑:

日志

Started POST "/users/13/create_admin" for 127.0.0.1 at 2013-07-16 17:01:38 +0100
Processing by UsersController#create_admin as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"VpP78Zy8SAcyC1Mgg6hEjG2I5jqNzIHXQGtbjUzDYVE=", "users"=>{"email"=>"test@admin.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up", "id"=>"13"}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 13 LIMIT 1
   (0.3ms)  BEGIN
   (0.1ms)  ROLLBACK
  Rendered users/create_admin.html.erb within layouts/application (0.0ms)
Completed 200 OK in 12ms (Views: 5.3ms | ActiveRecord: 0.9ms)

这是我的表格:

  <%= form_for :users, :html => { :id => "signup-form" }, :url => create_admin_user_path do |f| %>
<div><%= f.label :email %>
<%= f.email_field :email, :autofocus => true %></div>

<div><%= f.label :password %>
<%= f.password_field :password %></div>

<div><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation %></div>

<div class="actions">
  <div><%= f.submit "Sign up", :class => "btn btn-success" %></div>
</div>

【问题讨论】:

  • 用户是在数据库中创建的吗?当您尝试使用新帐户登录时,是否表明密码错误?您可以使用新帐户的电子邮件地址重置密码吗?
  • 您的管理员真的是“用户”,还是“管理员用户”或“管理员”?
  • 你能发布你的用户模式吗?
  • @JamesChevalier 我检查了数据库,它没有被添加到用户表中。
  • 更改为@user.save! -- 你会明白为什么它没有保存的原因

标签: ruby-on-rails ruby ruby-on-rails-3 devise


【解决方案1】:

你实际上是在发帖

"users"=>{"email"=>"test@admin.com", "password"=>""}

所以,你应该是

@user = User.new(:email => params[:users][:email], :password => params[:users][:password], :password_confirmation => params[:users][:password_confirmation]))
@user.admin = true
@user.save

【讨论】:

  • 我把!保存并获取后:验证失败:邮箱不能为空,密码不能为空。所以我怀疑你的正确。但是,使用您发布的代码,我得到: nil:NilClass 的未定义方法`[]'
  • 知道了,应该是 :user 而不是 :users。现在工作。感谢您的帮助!
  • User.new(params[:user]) 然后将模型中的属性列入白名单,或者使用params[:user].splice 过滤?
【解决方案2】:

在新设计中,应该从参数哈希中删除密码。如果密码为空。例如。我们要编辑个人资料但不更改密码。 否则设计将无法通过验证。

if params[:user][:password].blank?
  params[:user].delete(:password)
  params[:user].delete(:password_confirmation)
end

更多详情请见documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2015-07-16
    相关资源
    最近更新 更多