如何设置局部变量

时间:2013-07-04 17:19:57

标签: ruby-on-rails ruby

我正在尝试使用以下方法基于用户名称在回调中创建虚荣网址:

before_create :generate_vanity_url

def generate_vanity_url
    vanity_url = self.name
    vanity_url.gsub!(/[^\w]/,"") 
end

发生的问题是不仅变量vanity_url受到gsub的影响!方法,但也是name属性。我做错了什么?

聚苯乙烯。该方法更为广泛,但我为了清晰起见将其缩短了

2 个答案:

答案 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"