2011-06-13 9 views
1

SO,레일에서 self.attribute =를 사용하지 않고 어떻게 할당 할 수 있습니까?

나는 잠시 동안 작업 해왔다. 나는 답을 얻지 못했지만 훨씬 더 큰 질문을 게시했지만 여기서는 훨씬 간단한 질문을 할 것이다.

내 질문은, 어떻게 다른 나는 다음과 같은 상황에서 = self.attribute를 사용하지 않고 뭔가를 할당 할 수 있습니다 때 나는 photo_from_url을해야

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 

클래스 메소드는 그래서 나는 그러나 delayed_job에서 호출 할 수 있습니다 자기를 추가하면, "no method found photo ="라는 메시지가 나타납니다.

도와주세요! 미리 감사드립니다 ...

답변

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 
+0

빅터, 당신은 절대 생명의 은인입니다. 이것은 효과가 있었다. 너에게 충분히 감사 할 수 없다. –

2

클래스 메서드는 정의에 따라 특정 개체 인스턴스를 참조하지 않습니다. 따라서 수정할 개체를 가져 오는 방법이 있어야합니다. 가장 간단한 해결책은 해당 객체의 참조를 클래스 메소드에 전달하고 self 대신이를 사용하는 것입니다.

class Foo 
    def self.photo_from_url(url, obj) 
    ... 
    obj.photo = remote_photo 
    ... 
    end 
end 

사용 예제 : 나는 수업 방법으로 photo_from_url를 호출하고 어떻게

foo = Foo.new # creates a new instance of Foo 
Foo.photo_from_url("http://example.com/photo/12341", foo) 

주의 사항? 이는 Foo 클래스에서 작동하며 fooFoo의 인스턴스가 아니기 때문에 발생합니다.

Class and Instance Methods in Ruby

+0

안녕하세요 제레미 - 저에게 다시 연락해 주셔서 감사합니다. 당신이 제안한 것은 효과가있는 것처럼 보이지만 질문이 있습니다 (아마추어 코더는 여기에 있습니다). 너는 obj에 무엇을 지나가고 있는가? 아마 ID일까요? –

+0

설정하고 싶은'photo' 속성이 들어있는 객체의 인스턴스. 내 답변에 예제 사용 시나리오를 추가하겠습니다. – Jeremy

+0

obj를 전달하는 점은 무엇입니까? 인스턴스 메소드를 알고 있어야합니다. –

관련 문제