是否可以通过.send设置属性值?

时间:2014-05-14 08:28:51

标签: ruby-on-rails ruby

我可以这样做吗?

self.send(:twitter_url) = result

对我来说,这并不是这样的。

self.send(:twitter_url, result) # this doesn't work either

Model.twitter_url是一个属性(字符串列)

我需要这个来进行重构。


好的,还有一件事:

argument = :twitter_url
self.send(argument=, result)

我该怎么办?

3 个答案:

答案 0 :(得分:7)

你应该使用twitter_url=“setter”方法,所以这应该有效:

send(:twitter_url=, result)

关于您的编辑,您至少可以做两件事:

第一种方法:

send("#{argument}=", result)

第二种方法,使用write_attribute

write_attribute(argument, result)

答案 1 :(得分:3)

对于Rails(ActiveRecord)模型,您可以通过write_attribute设置属性:

write_attribute(:twitter_url, result)

或简写[]=

self[:twitter_url] = result

答案 2 :(得分:1)

我不会重复其他人'答案,但只是想指出myobj.send("methodname=", value)myobj[:methodname] = value之间的差异。

第二个绕过了通常的setter方法,它可以做额外的" stuff",即除了设置值之外还有额外的功能。例如,对于搜索或优化原因,使用邮政编码,您可能会有另一个字段删除空格并使邮政编码更新,例如

#in User, who has name, address1, address2, postcode, tidied_postcode
def postcode=(pcode)
  self[:postcode] = pcode #the usual content of a setter like this
  self[:tidied_postcode] = pcode.gsub(" ","").upcase #some extra functionality
end

在这种情况下,如果您要执行以下任一操作,tidied_postcode 也会更新。

@user.postcode = "abc 123"
@user.send("postcode=", "abc 123")

然而,tidied_postcode 不会更新。

@user[:postcode] = "abc 123"
@user.write_attribute(:postcode, "abc 123")

我只是提到这个以防万一。