我正在尝试使用以下方法基于用户名称在回调中创建虚荣网址:
before_create :generate_vanity_url
def generate_vanity_url
vanity_url = self.name
vanity_url.gsub!(/[^\w]/,"")
end
发生的问题是不仅变量vanity_url受到gsub的影响!方法,但也是name属性。我做错了什么?
聚苯乙烯。该方法更为广泛,但我为了清晰起见将其缩短了
答案 0 :(得分:6)
您不必使用.dup
,只是不要使用.gsub!
.gsub!
是一种破坏性方法,意味着它会修改原文。.gsub
是非破坏性的,不会修改原始所以是的,这样的事情应该可以解决问题
before_create :generate_vanity_url
def generate_vanity_url
@vanity_url = self.name.gsub /[^\w]/, ""
end
同样\W
与[^\w]
相同,所以请改为
before_create :generate_vanity_url
def generate_vanity_url
@vanity_url = self.name.gsub /\W/, ""
end
~ % pry
[1] pry(main)> str = "hello world"
=> "hello world"
[2] pry(main)> str.gsub /o/, "a"
=> "hella warld"
[3] pry(main)> str
=> "hello world"
[4] pry(main)>
答案 1 :(得分:3)
据我所知(可能很差),这是写时复制的结果。 喜欢那样
vanity_url = self.name.dup
vanity_url.gsub!(/[^\w]/,"")
irb
没有.dup
...
> a = "asdf"
=> "asdf"
> b = a
=> "asdf"
> b.gsub!(/a/, 'q')
=> "qsdf"
> a
=> "qsdf"
> b
=> "qsdf"
...以及.dup
> a = "asdf"
=> "asdf"
> b = a.dup
=> "asdf"
> b.gsub!(/a/, 'q')
=> "qsdf"
> a
=> "asdf"
> b
=> "qsdf"