我正在尝试使用以下方法在基于用户名的回调中创建一个虚 url:
before_create :generate_vanity_url
def generate_vanity_url
vanity_url = self.name
vanity_url.gsub!(/[^\w]/,"")
end
出现的问题是不仅变量 vanity_url 受到 gsub 的影响!方法,但名称属性也是如此。我究竟做错了什么?
附言。该方法更广泛,但为了清楚起见,我将其缩短了
我正在尝试使用以下方法在基于用户名的回调中创建一个虚 url:
before_create :generate_vanity_url
def generate_vanity_url
vanity_url = self.name
vanity_url.gsub!(/[^\w]/,"")
end
出现的问题是不仅变量 vanity_url 受到 gsub 的影响!方法,但名称属性也是如此。我究竟做错了什么?
附言。该方法更广泛,但为了清楚起见,我将其缩短了
你不必使用.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)>
据我所知(可能很差),这是写时复制的结果。那样做
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"