2013-07-04 116 views
1

我試圖創建基於用戶名以下方法回調個性化網址:如何設置一個局部變量

before_create :generate_vanity_url 

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

,發生的問題是,不僅變量VANITY_URL變受gsub影響!方法,但名稱屬性也是如此。我究竟做錯了什麼?

Ps。該方法更廣泛,但爲了清晰起見,我將其縮短了。

回答

3

據我所知(可能很差),這是寫入時複製的結果。 不喜歡在irb

沒有.dup

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

簡單的例子...

> 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" 
6

您不必使用.dup,只是不要使用.gsub!

  • .gsub!是一種破壞性的方法,這意味着它修改了原文。
  • .gsub是非破壞性的並且不修改原

所以,是的,這樣的事情應該做的伎倆

before_create :generate_vanity_url 

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

而且\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)> 
+0

你說得對,但在切換到'gsub'時沒有教訓。 COW是值得了解的重要Ruby特性。 –

+0

你是什麼意思「沒有教訓」? 'gsub!'應該從來沒有用過。 – naomik

+1

在這種情況下 - 也許。但@yor mazar無論如何都會使用它,我認爲值得知道它可能有哪些副作用。 –

相關問題