gpt4 book ai didi

ruby-on-rails - 设计 after_sign_in_path_for 不工作;当模型在 : :update 上进行验证时被忽略

转载 作者:行者123 更新时间:2023-12-03 17:35:15 25 4
gpt4 key购买 nike

我的方法正在执行,但设计根本没有使用返回值。在登录页面上,它只是重新加载带有“登录成功”通知的页面。它不会重定向到从方法返回的值。
日志

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
文档:
https://github.com/plataformatec/devise/wiki/How-To%3A-Redirect-to-a-specific-page-on-successful-sign-in-and-sign-out
http://www.rubydoc.info/github/plataformatec/devise/master/Devise/Controllers/Helpers:after_sign_in_path_for

我加了
  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.
我确实有一个 session ,可以在其他地方导航。我的验证是 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)

最佳答案

由于您只需要更新时的验证,我想您只需要特定表单的验证,因为即使没有此验证,您的用户仍然有效。
在这种情况下,我将使用所谓的表单对象,它为您执行更新验证并删除用户模型上的更新验证。在这种情况下,您的验证不会影响应用程序的其他部分。

Here是关于如何仅使用 ActiveModel 做到这一点的好指南。

例子:

应用程序/模型/user.rb

class User < ApplicationRecord
# remove the validations here
end

应用程序/表单/user_edit_form.rb
class UserEditForm
include ActiveModel::Model

ATTRIBUTES = :email, :name, :title, :phone,
:address1, :city, :state, :zip,
:country, :type, :signature
attr_accessor *ATTRIBUTES

validates *ATTRIBUTES, presence: true

def update(user)
if valid?
user.update(self.attributes)
end
end

def self.for_user(user)
new(user.slice(*ATTRIBUTES)
end
end

用户 Controller .rb
class UsersController
def edit
@user = User.find(params[:id])
@user_edit_form = UserEditForm.for_user(@user)
end

def update
@user = User.find(params[:id])
@user_edit_form = UserEditForm.new(user_update_params).update(@user)
if @user_edit_form.errors?
render :edit
else
redirect_to user_path(@user)
end
end

def user_update_params
# ...
end
end

编辑.html.erb
<%= form_for @user_edit_form, url: user_path(@user), method: :patch do |f| %>
# ...

<%= f.submit %>
<% end %>

替代

另一种方法是向模型添加一个虚拟属性,并在用户 Controller 中有条件地运行验证。
class User < ApplicationRecord
attr_accessor :profile_complete

with_options if: -> { profile_complete } do
validates :email, :name, :title, :phone, :address1, :city, :state, :zip, :country, :type, :signature, presence: true
end
end

用户 Controller .rb
class UsersController < ApplicationController
def update
@user = User.find(params[:id])
@user.profile_complete = true
if @user.update(user_update_params)
redirect_to @user
else
render :edit
end

# ...
end
end

注意:除了使用虚拟属性 (attr_accessor),您还可以使用真实的 DB 属性,这样您实际上也可以知道哪些用户完整填写了他们的个人资料。

备选方案 2

在其他一些项目中,我还使用了状态机 gems(有几个,例如 aasmstatemachines-activerecord )来做类似的事情。一些状态机 gems 甚至支持仅对某些状态或转换进行验证。

关于ruby-on-rails - 设计 after_sign_in_path_for 不工作;当模型在 : :update 上进行验证时被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com