【发布时间】:2018-02-21 19:13:40
【问题描述】:
我的方法正在执行,但 Devise 根本没有使用返回值。在登录页面上,它只是重新加载带有“登录成功”通知的页面。它不会重定向到从方法返回的值。
日志
Started POST "/users/sign_in" for 127.0.0.1 at 2018-03-05 22:19:50 -0500
Processing by Users::SessionsController#create as HTML
Parameters: {"utf8"=>"√", "authenticity_token"=>"tQd5a43StP85oyyCpEmFU8cAkFXdJL2OLpuAK1+sqQC6/rIqcd+fB2iE4RT0RoPKPCqreNBYlv2bxjl9gZFrWg==", "user"=>{"email"=>"test11@example.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
User Load (2.0ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["email", "test11@example.com"], ["LIMIT", 1]]
(5.0ms) BEGIN
User Exists (3.0ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 AND ("users"."id" != $2) LIMIT $3 [["email", "test11@example.com"], ["id", 23], ["LIMIT", 1]]
Sector Load (0.0ms) SELECT "sectors".* FROM "sectors" INNER JOIN "sectors_users" ON "sectors"."id" = "sectors_users"."sector_id" WHERE "sectors_users"."user_id" = $1 [["user_id", 23]]
Region Load (0.0ms) SELECT "regions".* FROM "regions" INNER JOIN "regions_users" ON "regions"."id" = "regions_users"."region_id" WHERE "regions_users"."user_id" = $1 [["user_id", 23]]
Criterium Load (0.0ms) SELECT "criteria".* FROM "criteria" INNER JOIN "criteria_users" ON "criteria"."id" = "criteria_users"."criterium_id" WHERE "criteria_users"."user_id" = $1 [["user_id", 23]]
AssetType Load (0.0ms) SELECT "asset_types".* FROM "asset_types" INNER JOIN "asset_types_users" ON "asset_types"."id" = "asset_types_users"."asset_type_id" WHERE "asset_types_users"."user_id" = $1 [["user_id", 23]]
Company Load (1.0ms) SELECT "companies".* FROM "companies" WHERE "companies"."id" = $1 LIMIT $2 [["id", 42], ["LIMIT", 1]]
(5.0ms) ROLLBACK
############### /users/23/edit
Rendering users/sessions/new.haml within layouts/application
Rendered users/shared/_links.html.erb (3.0ms)
Rendered users/sessions/new.haml within layouts/application (251.2ms)
Rendered layouts/_footer.haml (15.0ms)
Completed 200 OK in 6554ms (Views: 3364.9ms | ActiveRecord: 86.1ms)
注意它正在渲染users/sessions/new.haml 而不是编辑页面?
代码
class ApplicationController < ActionController::Base
...
def after_sign_in_path_for(resource)
logger.debug '############### ' + edit_user_path(resource) if resource.is_a?(User) && resource.signature.blank?
return edit_user_path resource if resource.is_a?(User) && resource.signature.blank?
stored_location_for(resource) ||
if resource.is_a?(User)
dashboard_path
elsif resource.is_a?(Facilitator) && resource.name.nil?
edit_facilitator_path resource
elsif resource.is_a?(Facilitator)
facilitator_path resource
else
super
end
end
我完全注释掉了这个方法,它仍然重新加载了登录页面。
Started POST "/users/sign_in" for 127.0.0.1 at 2018-03-05 22:25:21 -0500
...
Rendering users/sessions/new.haml within layouts/application
设计 4.4.0
文档:
我加了
def after_sign_in_path_for(resource)
logger.debug '############# ' + resource.errors.full_messages.join(', ')
确实发现了类似的验证错误
############# Title can't be blank, Country can't be blank, Signature can't be blank, ...
但它确实显示了通知
Signed in successfully.
我确实有一个会话,可以在其他地方导航。我的验证是on: :update。
validates :email, :name, :title, :phone, :address1, :city, :state, :zip, :country, :type, :signature, presence: true, on: :update
这不会导致登录行为错误。
我评论了模型上的所有验证,它确实有效,但这非常不寻常!验证不应影响登录行为。必须有一个解决方法。
Started POST "/users/sign_in" for 127.0.0.1 at 2018-03-05 23:11:43 -0500
SQL (15.0ms) UPDATE "users" SET "current_sign_in_at" = $1, "last_sign_in_at" = $2, "current_sign_in_ip" = $3, "sign_in_count" = $4, "updated_at" = $5 WHERE "users"."id" = $6 [["current_sign_in_at", "2018-03-06 04:11:44.225501"], ["last_sign_in_at", "2017-11-09 01:22:28.245231"], ["current_sign_in_ip", "127.0.0.1/32"], ["sign_in_count", 6], ["updated_at", "2018-03-06 04:11:44.230506"], ["id", 23]]
Redirected to http://localhost:3000/users/23/edit
Completed 302 Found in 2183ms (ActiveRecord: 48.0ms)
【问题讨论】:
-
也许在条件块中抛出一些
logger.debug语句,以便您知道代码的去向? -
注意:我不知道这是否是您的问题,但我注意到 ruby 有时会对括号感到困惑。我会使用
edit_user_path(resource),以防它对放置if的位置感到困惑。例如,也许它正在做类似的事情:edit_user_path(resource if resource.is_a?(User) && resource.signature.blank?)其次:我觉得ROLLBACK有点奇怪......为什么它似乎无法从数据库加载用户? -
@CD-RUM 如果你看到调试语句的结果,你可以看到条件结果为真,所以它在最后一个调试语句之后立即返回。
-
@TarynEast 如果括号是这样的话,那是无效的 Ruby。无论如何,我将它们添加到论点中,但这没有帮助。我从日志中删除了一些 SQL 语句。它执行用户加载、BEGIN 事务、用户存在,然后加载几个关系,然后 ROLLBACK。我也不知道为什么。可能是因为 Devise 正在设置上次登录时间或其他内容并保存记录并进行验证?
-
回滚会取消保存。它可以被解释为有效的 ruby,如果条件:
resource.is_a?(User) && resource.signature.blank?失败,则返回 nil。它绝对不是 good ruby...绝对不会是 clear ruby,也绝对不是预期的 ruby...因此为什么具体会有所帮助。很高兴知道您实际尝试过,但这不是问题 - 我们可以排除这种极端情况。调试包括一一排除故障的可能原因,直到找到实际问题:)
标签: ruby-on-rails devise ruby-on-rails-5