1

我正在尝试使用以下方法在基于用户名的回调中创建一个虚 url:

before_create :generate_vanity_url

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

出现的问题是不仅变量 vanity_url 受到 gsub 的影响!方法,但名称属性也是如此。我究竟做错了什么?

附言。该方法更广泛,但为了清楚起见,我将其缩短了

4

2 回答 2

7

你不必使用.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)>
于 2013-07-04T17:32:26.420 回答
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"
于 2013-07-04T17:22:56.557 回答