SO,
我一直在研究这个问题,我发布了一个更大的问题没有得到任何回复,但我会在这里问一个更简单的问题。
我的问题是,在以下情况下,如何在不使用self.attribute =的情况下分配内容:
def photo_from_url(url)
remote_photo = open(url)
def remote_photo.original_filename;base_uri.path.split('/').last; end
**self.photo = remote_photo**
self.save
end
我需要让photo_from_url成为一个类方法,所以我可以从delayed_job中调用它,但是当我添加self时,它会给我“找不到方法photo =”。
请帮忙!提前谢谢......
答案 0 :(得分:2)
根据定义,类方法不引用任何特定的对象实例。因此,您必须有办法获取要修改的对象。最简单的解决方案是将该对象的引用传递给您的类方法,并使用它而不是self
。
class Foo
def self.photo_from_url(url, obj)
...
obj.photo = remote_photo
...
end
end
使用示例:
foo = Foo.new # creates a new instance of Foo
Foo.photo_from_url("http://example.com/photo/12341", foo)
请注意我如何将photo_from_url
作为类方法调用?这是因为它在Foo
类上运行,而不是Foo
的实例,恰好是foo
。
以下是一些关于类和实例方法之间差异的文献:
答案 1 :(得分:2)
选项1:每次调用此方法时都要创建新对象:
class Photo < ActiveRecord::Base
def self.photo_from_url(url)
...
new(:photo => remote_photo).save!
end
end
选项2:您想要更新现有对象,然后需要获取要修改的对象ID:
class Photo < ActiveRecord::Base
def self.photo_from_url(url)
...
id = # here you find id, e.g. from url
find(id).update_attributes!(:photo => remote_photo)
end
end