2013-07-04 71 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无论如何都会使用它,我认为值得知道它可能有哪些副作用。 –

相关问题