【问题标题】:Rails 4 with Devise: Validation errors displayed immediately upon rendering form带有设计的 Rails 4:渲染表单后立即显示验证错误
【发布时间】:2013-12-02 09:27:37
【问题描述】:

我目前正在尝试实现我的第一个重要的 Rails 应用程序,但在尝试实现 Devise 时遇到了一些问题。最初,我使用的是 Hartl Rails 教程中描述的手动验证方法。在退出(或者我相信)所有手动代码之后,我添加了 Devise gem,以及一些自定义字段,所有这些在幕后都可以正常工作,这意味着我可以注册、登录和以其他方式使用应用程序。

然而,我现在遇到的问题是,我错过了验证中的一个技巧,因为一旦我导航到用户注册视图,表单就会呈现完整的大、丑陋、红色的错误消息,如下所示:

Email can't be blank
Password can't be blank
First name can't be blank
Last name can't be blank

请记住,这些错误消息是在渲染时立即生成的,甚至在用户有机会输入数据之前。

我可以通过注释掉user.rb 中的验证来消除名字和姓氏错误。如果我去掉 Devise 可验证模块,我可以防止出现电子邮件和密码错误。

这里是 user.rb:

class User < ActiveRecord::Base
    # Include default devise modules. Others available are:
    # :confirmable, :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

    belongs_to :entry
    has_many :categories
    has_many :rates
    has_many :entries

    # If I comment out the next four lines regarding validation, error messages disappear

    validates :first_name, presence: true
    validates :first_name, uniqueness: true, if: -> { self.first_name.present? }

    validates :last_name, presence: true
    validates :last_name, uniqueness: true, if: -> { self.last_name.present? }

    def full_name
        fullname = "#{last_name}, #{first_name}"
    end

end

在用户实际提交数据之前,我如何才能让这些错误消息不显示,以及在提交数据时,我如何验证每个字段(因为我目前的非解决方案只是为了完全避免验证)?提前致谢。

【问题讨论】:

  • 您是否在没有手动定义验证的情况下进行了测试? Devise 提供了自己的验证,我将首先对其进行测试 :)
  • 通过一项一项地做这两件事来测试,一次从这个模型中删除:validatable,第二次删除你自己的验证,但继续工作:validatable
  • 正如我在原帖中提到的(我知道,它很长):如果我注释掉我的自定义字段(first_name,last_name)的验证,错误消息不会显示,但我没有验证。如果我删除了 :validatable 模块,我唯一的保护就是电子邮件字段是 f.email_field,并且允许使用空白密码。你可以理解为什么这是不可接受的。
  • @Rich Peck:出于好奇,我使用包含这些自定义字段的自定义视图 (config.scoped views = true) 创建了一个带有自定义 first_name 和 last_name 字段的 Devise 准系统实现,并且我没有错误消息。显然,有些不同,但 application_controller.rb 是相同的,并且工作版本上的用户模型仅包含设计模块信息。也许我会削减原始副本中的 user.rb,看看会发生什么。
  • 嗯。 Devise有一个脾气暴躁的习惯!如果您尝试其他方法,请告诉我们:)

标签: ruby-on-rails ruby validation devise


【解决方案1】:

一些坏消息和一些好消息。坏消息是,在为这个问题扯掉头发后,我已经秃了一半。好消息是有一个简单的解决方案。

问题与用户模型或验证无关。问题在于我链接到注册机制的方式。

我有一个索引页面,其中包含注册、注册和退出的链接。问题在于我构建注册链接的方式。

错误:

<%= link_to "Register", user_registration_path, :method => :post %>

通过指定 POST 方法,我告诉 Rails 在有人单击链接时获取数据并尝试注册用户。当然,当您只是尝试呈现注册表单时,没有数据params 哈希为空,因此它会根据我包含的 :validatable 模块(仅验证 :email:password 的准系统设计字段)和我的自定义验证向表单抛出错误为:first_name:last_name 添加。

我不敢相信我不能只见树木不见森林。 POST 的意思是“修改这个”,但我的意图只是呈现一个表单,这意味着 GET 本来是合适的。 POST 出现在用户提供数据之后,并且正确地绑定到提交按钮,而不是表单的链接。

当您更改方法时,您还必须更改路由以匹配,因为 POST 与路由 devise/registrations#create 相关联。

对:

<%= link_to "Register", new_user_registration_path, :method => :get %>

我陷入了这个陷阱,因为我认为我在采用 Devise 之前已经撤消了我实施的所有原始身份验证代码,这对于模型、控制器和路由是正确的,但对于视图却不是。

所以现在我必须在 Hair Underflow 上发布关于如何让我的头发更快长回来的帖子,但与此同时,我松了一口气。

【讨论】:

  • 我也遇到了这个问题。谢谢。顺便说一句,你的头发长回来了吗
  • 哈哈。是的,但我现在剪了平头,所以我抓不住更多的头发。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多