无法迭代唯一元素

时间:2015-07-02 14:14:09

标签: ruby-on-rails arrays ruby

我有一系列错误如下:

n.errors.full_messages
# => ["Password can't be blank", "Password can't be blank", "Password is too short (minimum is 3 characters)"] 

我想迭代这个数组的独特元素并在屏幕上显示它们。

验证模型

class Member < ActiveRecord::Base
  has_one :profile
  before_save { self.username = username.downcase }
  has_secure_password
  validates :password, presence: true, length: { minimum: 3 }
end

n.errors.full_messages.uniq do |a|
  puts a
end

uniq无效,"Password can't be blank"在我的数组中出现两次。有什么想法吗?

Password can't be blank
Password can't be blank
Password is too short (minimum is 3 characters)
# => ["Password can't be blank"]

3 个答案:

答案 0 :(得分:4)

编辑:这实际上并没有回答这个问题,如果谷歌把你带到这里,请使用@BroiSatse的答案。

您收到该消息两次的原因是has_secure_password

http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#method-i-has_secure_password

第一个项目符号点似乎添加了需要密码的验证。

在您的模型中,您还要添加

validates :password, presence: true, length: { minimum: 3 }

presence: true部分增加了相同的验证。删除它所以:

validates :password, length: { minimum: 3 }

这应解决问题。

答案 1 :(得分:3)

带块的

uniqe使用块的值来比较元素。你想要的是:

n.errors.full_messages.uniq.each do |m|

无论如何,我认为你是从错误的角度解决问题 - 你的问题不是如何避免显示重复的消息,而是如何重复这种情况。

答案 2 :(得分:0)

你可以做一个字符串比较。

让阵列对您有问题。翻过来,将元素逐个保存到新数组中。

现在,当第一个添加到新阵列时,请检查阵列中的所有元素是否与要添加的新元素不匹配。例如:"My string".eql? "My sting"

在Ruby中可能有更聪明的方法。但是,当手动使用其他语言时,这就是想法。