我可以这样做吗?
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)
我该怎么办?
答案 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")
我只是提到这个以防万一。