[英]problems with bcrypt-ruby
我是Rails的新手,正在尝试编写应用程序的一部分,该部分处理我可以在以后的所有应用程序中使用的所有讨厌的帐户内容(我找不到能够为我做这些工作的样板)。
无论如何。 我已经安装了bcrypt,并且正在尝试注册一个新用户。 我在routes.rb
创建了一条路线进行注册。 我也将安装的bcrypt-ruby
gem添加到我的Gemfile
。 我从bcrypt-ruby.rubyforge.org复制了源代码,我的代码如下所示。
class RegisterController < ApplicationController
def create
@user = User.new(params[:user])
@user.password = params[:password]
@user.save!
end
end
我的用户模型如下所示。
require 'bcrypt'
class User < ActiveRecord::Base
# users.password_hash in the database is a :string
include BCrypt
def password
@password ||= Password.new(password_hash)
end
def password=(new_password)
@password = Password.create(new_password)
self.password_hash = @password
end
end
我做了很多不同的事情来确定问题所在。 我向寄存器控制器提交某些内容时遇到的错误是
NoMethodError (undefined method `stringify_keys' for "a":String): app/controllers/register_controller.rb:3:in `create'
所以这是我的问题。 什么是def password=(new_password)
,这种语法对我来说是陌生的。 什么是||=
。 这种语法对我来说也是陌生的。 为什么会出现此错误? 是否可以使用导轨样板来避免麻烦并可以开始编码?
干杯,谢谢!
编辑:添加了视图代码
<%= form_tag("/register#create", method: "post") do %>
<p><%= text_field_tag(:user) %></p>
<p><%= text_field_tag(:password) %></p>
<p> <%= submit_tag("Register") %></p>
<% end %>
def password=(new_password)
在Ruby中,您通常认为是运算符的所有东西( +
, -
, =
等)都实现为方法,并且您可以为自己的方法做同样的事情。 这就是它:只是password=
的方法。 这意味着user.password =
其他代码调用user.password =
,它实际上就是在调用此方法。
||=
这实际上是在说“返回此用户实例的密码,但如果不存在,请首先创建一个”。 如果那里有user.password
,它只会返回它。 否则,它将创建一个新Password
并返回该Password
。
我不确定为什么会收到此错误,但是我的猜测是params[:user]
不是应该的。 (是一个字符串,而不是一个哈希吗?)该错误抱怨它无法处理您的参数,因此请看一下params[:user]
是什么。 它看起来应该像这样: { password: 'password' }
绝对,您没有理由执行此操作。 Devise是一种广泛使用的身份验证工具,它将为您完成所有(甚至更多)工作。 您还可以使用ActiveRecord的has_secure_password
功能,该功能也使用BCrypt,但是还需要进行一些设置工作,并且不如Devise灵活。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.