【发布时间】:2011-10-31 12:42:57
【问题描述】:
我最近从 Devise 1.2 升级到 1.4.9,除了我的可确认模块外,一切似乎都正常。电子邮件与整个过程一样有效。但是确认页面总是空白的。它可以工作并确认电子邮件帐户,但不会重定向用户并引发 406 错误。对于错误的确认尝试也是如此。
路线似乎工作正常,我在我的用户模型中指定了可确认的,其他没有任何改变。
有什么想法吗?我是否缺少某些设置或需要为 1.4.9 更新的内容?
更新
生成的 URL 似乎有问题。出于某种未知原因,它在确认 URL 前加上用户名?这导致它破裂。但我仍然不确定如何解决它。
http://localhost:5000/users/confirmation.someusername?confirmation_token=R7apAPhC5c3rszvhsowp
上面 URL 中的用户名导致进程无法工作。
我检查了 1.2 中的控制器(有效)和新版本之间的差异。
1.2
# GET /resource/confirmation?confirmation_token=abcdef
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
if resource.errors.empty?
set_flash_message :notice, :confirmed
sign_in_and_redirect(resource_name, resource)
else
render_with_scope :new
end
end
1.4.9
# GET /resource/confirmation?confirmation_token=abcdef
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_navigational_format?
sign_in(resource_name, resource)
respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
else
respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render_with_scope :new }
end
end
protected
# The path used after resending confirmation instructions.
def after_resending_confirmation_instructions_path_for(resource_name)
new_session_path(resource_name)
end
# The path used after confirmation.
def after_confirmation_path_for(resource_name, resource)
after_sign_in_path_for(resource)
end
错误
Started GET "/users/confirmation.sdfsdfsd?confirmation_token=vmxmx73xvM7sUfcvH9CX" for 127.0.0.1 at 2011-10-31 13:30:33 +0100
Processing by Devise::ConfirmationsController#show as
Parameters: {"confirmation_token"=>"vmxmx73xvM7sUfcvH9CX"}
SQL (1.1ms) SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"users"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
User Load (1.2ms) SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'vmxmx73xvM7sUfcvH9CX' LIMIT 1
SQL (0.7ms) SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"users"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
Completed 406 Not Acceptable in 28ms
【问题讨论】:
-
很明显 url 导致 406 /users/confirmation.someusername?... “.someusername”(包括点)将被视为您想要返回的响应格式。所以也许如果你尝试在你的 route.rb 文件中准备路由规则可以修复这个
get /users/confirmation.:username", :controller => :users, :action=> confirmation ...
标签: ruby-on-rails ruby-on-rails-3 authentication devise