我正在尝试将名称保存到数据库中并且单个单词(firstname)正常工作但是当用户同时输入firstname和lastname时,我希望Rails将其作为firstname-lastname而不是firstname lastname(space)保存到数据库中之间)。
我知道我或许应该使用之前的创建过滤器,但我不确定这需要怎么样。我希望验证工作,即没有两个人应该能够使用相同的名称。
我正在使用Rails 3。
答案 0 :(得分:42)
您可以在字符串上使用ActiveSupport的变形方法parameterize
。
name = 'john smith' # => john smith
name.parameterize # => john-smith
此外,参数化可以选择用于分词,因此您可以使用下划线替换短划线:
name.parameterize("_") # => john_smith
使用参数化的一个优点是它将字符规范化为拉丁语,所以......
name = "jöhanne såltveç"
name.parameterize # => johanne-saltvec
答案 1 :(得分:3)
为什么不在db中只有first_name和last_name列,并创建自己的验证规则以确保组合是唯一的(http://guides.rubyonrails.org/active_record_validations_callbacks.html#creating-custom-验证的方法)。您还应该在数据库中的这两列上创建唯一索引。
答案 2 :(得分:1)
另一个选择是我们regexp并用。替换所有现有空格。你会提出以下几点:
self.firstname.gsub(/\s+/, '-')
在您的模型中。
注意:我不确定ruby是否接受\s
作为“任何空白字符”而且我认为*应该确保如果有人输入带有两个相邻空格(或更多)的名称,它将不会将每个空格转换为单独的短划线,但只能转换为一个。
答案 3 :(得分:0)
其他答案正确
但是,如果要在参数化时保留大小写
name = "Donald Duck"
name.parameterize(preserve_case: true) # => Donald-Duck