当前位置: 首页 > 知识库问答 >
问题:

Rails验证-不应用cutom消息

习洲
2023-03-14

我有一个带有Price浮动字段和精度验证的Ride模型。当验证失败但不起作用时,我想显示我自己的自定义错误消息。

根据Rails Gudes的说法,“:消息选项允许您指定验证失败时将添加到错误集合中的消息。当不使用此选项时,活动记录将为每个验证助手使用相应的默认错误消息。:消息选项接受字符串或程序。”

我完全按照这里的例子来做,但它不起作用。

validates :age, numericality: { message: "%{value} seems wrong" }
validates :price, numericality: { message: "Invalid price. Max 2 digits after period"}, format: { with: /\A\d{1,4}(.\d{0,2})?\z/ }
context 'with more than 2 digits after period' do
      let(:price) { 29.6786745 }

      it 'the price is invalid' do
        expect(subject.save).to be_falsy
        expect(subject).not_to be_persisted
        puts subject.errors.full_messages.last # "Price is invalid"
      end
    end

我做错了什么?

这就是我到目前为止学到的。我在测试中将价格设置为空,现在它会显示我想要的错误消息。

context 'with more than 2 digits after period' do
      let(:price) { '' }

      it 'the price is invalid' do
        expect(subject.save).to be_falsy
        expect(subject).not_to be_persisted
        puts subject.errors.full_messages.last # "Price Invalid price. Max 2 digits after period"
      end
    end

结论:它适用于“在场”验证,而不是数字验证,这是非常令人困惑的,因为文档清楚地说,你验证的是数字,而不是在场。我说得对吗?这是错误还是故意的?

共有2个答案

耿珂
2023-03-14

我发现有两种验证:格式验证和数字验证。我没有将消息添加到格式验证中,所以当它失败时,我会得到标准消息

validates :price, format: { with: /\A\d{1,4}(.\d{0,2})?\z/, message: 'Invalid price. Max 2 digits after period'}, numericality: { message: 'is not a number' }
袁谭三
2023-03-14

我认为你错的地方是期望数值性接受一个验证选项格式。参考活动记录指南,没有格式选项。

看到你已经调用了这个price,你似乎想把精度保持在小数点后2位,这样你就可以存储某物的美元价值。正确的类型是小数点后加上刻度:2,或者我过去成功使用的方法是将价格存储为整数价格_美分

context 'with more than 2 digits after period' do
  let(:price) { 123.333 }

  it 'rounds to 2 decimal places' do
    expect(subject.save).to eq true
    expect(subject.reload.price).to eq 123.34
  end
end
 类似资料:
  • 我仍然(对于那些以前帮助过我的人)在验证数据时遇到问题。 场景 我有两个模型-用户和住宿,每个用户有一个住宿(has\u one)。我可以使用current\u user访问登录的用户。 问题所在 当我在注册时验证用户时,一切正常,每个验证规则都会相应地显示验证错误消息。然而,我现在尝试在输入住宿时验证住宿,并得到一个Rails错误页面: 未知操作 找不到住宿控制器的操作“show” 但有趣的是,

  • 我刚刚更新到rails 4.0.2,我收到了这个警告: [已弃用]我18n.enforce_available_locales将来会默认为true。如果您真的想跳过区域设置的验证,您可以设置I18n.enforce_available_locales=false以避免此消息。 将其设置为false是否存在任何安全问题?

  • 我试图理解spring中的验证消息和国际化机制,并编写了以下代码: Bean配置: 资源文件系统结构: 消息。属性: messages\u it。属性: 当我提交表单时,得到的错误消息是:{m1}。我是否缺少一些代码?

  • 我试图让我的javascript验证电话号码输入,并在用户输入信息不正确时显示消息。我还设置了另外两个输入,所以我复制了其中一个,并用phoneNumber替换了名称,但没有结果。没有HTML的替代品,请它是我必须使用我的评估。 这里我只包含了电话号码输入的代码。http://jsfiddle.net/29ZNV/ 超文本标记语言 JAVASCRIPT

  • 我对仅使用bcrypt的用户名和密码的用户注册验证有特定要求(没有设计!) 我目前正在工作: 我需要: 用户名: 只能包含字母、数字、短划线和下划线 必须至少包含一个大写字母、一个特殊字符、一个数字和一个小写字母

  • 我正在尝试学习自定义验证。下面是简单的代码: 当我试图通过rails控制台插入数据时, 2.3.0 :014 它让我插入数据。我应该做些什么来使我的自定义验证方法起作用?