2

그래서 레일즈 4 앱에는 이미지 업로드가 가능한 몇 가지 모델이 있습니다. 각 모델에 동일한 코드를 추가하는 대신 모든 모듈에 포함시킬 수있는 모듈을 만들었습니다.레일 4 ActiveSupport가 포함 된 ActiveRecord 모듈

여기는이 경우

module WithImage 
    extend ActiveSupport::Concern 

    included do 
    attr_accessor :photo 

    has_one :medium, as: :imageable 

    after_save :find_or_create_medium, if: :photo? 

    def photo? 
     self.photo.present? 
    end 

    def find_or_create_medium 
     medium = Medium.find_or_initialize_by_imageable_id_and_imageable_type(self.id, self.class.to_s) 
     medium.attachment = photo 
     medium.save 
    end 
    end 

    def photo_url 
    medium.attachment if medium.present? 
    end 
end 

class ActiveRecord::Base 
    include WithImage 
end 

Medium (미디어 단수)가 그것에 클립이있는 다형성 모델이다. attr_accessor는 다양한 형태의 f.file_field : 사진입니다. after_save 여기 좋은 작품, 그래서 여기

class PurchaseType < ActiveRecord::Base 
    include WithImage 

    validates_presence_of :name, :type, :price 
end 

건입니다 :

여기 내 PurchaseType 모델 (즉,이 믹스 인을 사용)입니다. 나는 희미한 단서 이것이 의미 또는 무엇을 왜 일어나고하지 않은

ActiveRecord::ActiveRecordError: ActiveRecord::Base doesn't belong in a hierarchy descending from ActiveRecord 

: 내가 콘솔로 이동 PurchaseType.last.photo_url을 할 때, 나는 다음과 같은 오류가 발생합니다. 누구나 통찰력이 있습니까?

감사합니다.

+0

필자는이 파일을 lib/with_image.rb에 넣었으며 제대로 포함 시켰음을 언급해야합니다. – goddamnyouryan

+1

'WithImage' 모듈에'class ActiveRecord :: Base' 원숭이 패치가 잘못되었다고 생각합니다. 왜 그렇게 필요한거야? –

+0

@muistooshort 맞습니다. 나는 그것을 이해하고 아래에 답변을 추가했습니다. – goddamnyouryan

답변

1

내가 여러 가지 모듈 예제에서 본 것들을 시도하고있는 것으로 나타났습니다.

module WithImage 
    extend ActiveSupport::Concern 

    included do 
    attr_accessor :photo 

    has_one :medium, as: :imageable 

    after_save :find_or_create_medium, if: :photo? 

    def photo? 
     self.photo.present? 
    end 

    def find_or_create_medium 
     medium = Medium.find_or_initialize_by_imageable_id_and_imageable_type(self.id, self.class.to_s) 
     medium.attachment = photo 
     medium.save 
    end 

    def photo_url 
     medium.attachment.url if medium.present? 
    end 
    end 
end