我是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),这种语法对我来说是陌生的。什么是||=。这种语法对我来说也是陌生的。为什么我会得到这个错误?有没有rails的样板,我可以用来省去这个麻烦,然后我就可以开始编码了?
干杯,谢谢!
编辑:添加视图代码
<%= 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 %>发布于 2013-11-26 10:50:18
def password=(new_password)在Ruby语言中,你通常认为是运算符的所有东西(+、-、=等)都被实现为方法,你也可以对自己的方法做同样的事情。这就是为什么:只是password=的一个方法。这意味着当其他代码调用user.password =时,它实际上是在调用此方法。
||=这实际上是说“返回这个用户实例的密码,但如果它不存在,请先创建一个”。如果user.password在那里,它就会返回它;否则,它会创建一个新的Password并返回它。
params[:user]不是它应该是的样子。(它是一个字符串,而不是散列吗?)错误是抱怨它不能处理你的参数,所以看看params[:user]是什么。它应该看起来像这样:{ password: 'password' }当然是
has_secure_password功能,该功能也使用BCrypt,但这也需要一些设置工作,而且比Devise的灵活性差得多。https://stackoverflow.com/questions/20207535
复制相似问题