我正在尝试使用Sorcery gem来验证用户身份,但是在填写注册表单后,它会重定向回到注册页面并显示错误。但是,我可以从控制台创建用户。
日志文件:
Started POST "/users" for 127.0.0.1 at 2012-01-23 13:54:12 -0500
Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Rh6R5rwLu+XchOv3ki9iATgihU8hqr84y4AcQbyKFyI=", "user"=> {"username"=>"testusername", "email"=>"testemail@email.com", "password"=>"[FILTERED]"}, "commit"=>"Register"}
[1m[35m (0.1ms)[0m SELECT 1 FROM "users" WHERE "users"."username" = 'testusername' LIMIT 1
[1m[36m (0.1ms)[0m [1mSELECT 1 FROM "users" WHERE "users"."email" = 'testemail@email.com' LIMIT 1[0m
Rendered users/new.html.erb within layouts/application (2.1ms)
Completed 200 OK in 29ms (Views: 17.1ms | ActiveRecord: 0.3ms)
users_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to 'Static#index', :notice => "Thanks for registering!"
else
render :new
end
end
end
模型/ user.rb:
class User < ActiveRecord::Base
authenticates_with_sorcery!
attr_accessible :username, :email, :password
validates_presence_of :username
validates_presence_of :password, :on => :create
validates_presence_of :email
validates_length_of :password, :minimum => 7
validates_length_of :username, :minimum => 10
validates_uniqueness_of :username
validates_uniqueness_of :email
end
配置/初始化/ sorcery.rb:
Rails.application.config.sorcery.submodules = []
Rails.application.config.sorcery.configure do |config|
config.user_config do |user|
end
config.user_class = "User"
end
巫术迁移:
class SorceryCore < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.string :username, :null => false
t.string :email, :default => nil
t.string :crypted_password, :default => nil
t.string :salt, :default => nil
t.timestamps
end
end
def self.down
drop_table :users
end
end
答案 0 :(得分:1)
这里跳出来的一件事是password
字段。您已将其设置为attr_accessible
,只有在该字段位于您的数据库中时才应使用该password
。与大多数身份验证解决方案一样,Sorcery不会将原始密码存储在数据库中,您可以从迁移文件中看到该密码,该文件不包含password
字段。
而是使用attr_accessor :password
attr_accessible :username, :email
的虚拟属性,以便永远不会存储原始字符串:
crypted_password
实际密码将通过Sorcery流程加密并存储在{{1}}字段中。
使用此设置,所有验证仍然有效。
答案 1 :(得分:0)
您需要在日志文件中看到的内容或多或少:
(0.1ms) SELECT 1 FROM "users" WHERE "users"."username" = 'testusername' LIMIT 1
(0.1ms) SELECT 1 FROM "users" WHERE "users"."email" = 'bogusbogus@bogusbogus.com' LIMIT 1
Binary data inserted for `string` type on column `crypted_password`
SQL (3.7ms) INSERT INTO "users" ("created_at", "crypted_password", "email", "salt", "updated_at", "username") VALUES (?, ?, ?, ?, ?, ?) [["created_at", Mon, 23 Jan 2012 20:39:46 UTC +00:00], ["crypted_password", "$2a$10$za6RqGnvHpAiNASQ86NCl.t/LyrGn1U1wHfzQ3X9f/NJYjY/ramJG"], ["email", "bogusbogus@bogusbogus.com"], ["salt", "xxRspPQysvq5yzp7xpFh"], ["updated_at", Mon, 23 Jan 2012 20:39:46 UTC +00:00], ["username", "testusername"]]
如果您看不到INSERT语句,则表示数据未通过验证。也许您正在尝试使用相同的用户名/电子邮件添加其他用户?否则它应该工作。尝试在rails控制台中创建用户:
irb> u = User.create username: 'testusername', ........
irb> u.errors.full_messages
是否会返回任何消息?
编辑:抱歉,我刚刚注意到您的更新,您在其中写道,您可以在控制台中创建用户。从日志文件看起来参数是可以的。你说,重定向到新页面时出错。这个错误说的是什么?答案 2 :(得分:0)
您在用户/新视图中拥有什么?
不要忘记,您在:username和:password上有长度验证。
也许你可以这样做:
attr_accessible \
:username,
:email,
:password,
:password_confirmation