2010-08-19 39 views
5

Tôi đang sử dụng kẹp giấy cho các tệp đính kèm cho nhiều kiểu sử dụng accept_nested_attributes_for. Có cách nào tôi có thể chỉ định các tùy chọn kiểu kẹp giấy cụ thể cho từng mô hình không?Đường ray Kiểu kẹp giấy đa hình

Trả lời

10

Có. Tôi sử dụng kế thừa bảng đơn (STI) trên các trang web để xử lý Âm thanh, Video và Hình ảnh thông qua mô hình Nội dung.

# models/Asset.rb 
class Asset < ActiveRecord::Base 
    # Asset has to exist as a model in order to provide inheritance 
    # It can't just be a table in the db like in HABTM. 
end 

# models/Audio.rb 
class Audio < Asset # !note inheritance from Asset rather than AR! 
    # I only ever need the original file 
    has_attached_file :file 
end 

# models/Video.rb 
class Video < Asset 
    has_attached_file :file, 
    :styles => { 
     :thumbnail => '180x180', 
     :ipod => ['320x480', :mp4] 
     }, 
    :processors => "video_thumbnail" 
end 

# models/Image.rb 
class Image < Asset 
    has_attached_file :file, 
    :styles => { 
     :medium => "300x300>", 
     :small => "150x150>", 
     :thumb => "40x40>", 
     :bigthumb => "60x60>" 
    } 
end 

Tất cả đều đi vào Rails là :file, nhưng bộ điều khiển (A/V/I) biết lưu vào mô hình phù hợp. Chỉ cần nhớ rằng tất cả các thuộc tính cho bất kỳ phương tiện truyền thông nào cần được bao gồm trong Asset: nếu video không cần phụ đề nhưng hình ảnh thì thuộc tính phụ đề sẽ là 0 cho số Video. Nó sẽ không phàn nàn.

Các liên kết cũng sẽ hoạt động tốt nếu được nối với các mô hình STI. User has_many :videos sẽ hoạt động giống như bạn đang sử dụng ngay bây giờ, chỉ cần đảm bảo bạn không cố lưu trực tiếp vào Nội dung.

# controllers/images_controller.rb 
    def create 
    # params[:image][:file] ~= Image has_attached_file :file 
    @upload = current_user.images.build(params[:image]) 
    # ... 
    end 

Cuối cùng, vì bạn có mô hình Nội dung, bạn vẫn có thể đọc trực tiếp từ mô hình đó, ví dụ: bạn muốn có danh sách 20 tài sản gần đây nhất. Ngoài ra, ví dụ này không bị giới hạn để tách các loại phương tiện, nó cũng có thể được sử dụng cho các loại khác nhau của cùng một điều: Avatar < Tài sản, Thư viện < Tài sản, v.v.

+2

Nơi nào bạn xác định nơi các tập tin được lưu? Trên mô hình nội dung? Hoặc là mô hình Nội dung trống? nói: ': storage =>: s3, : bucket => Rails.application.config.aws_s3_bucket, : s3_credentials =>" # {Rails.root} /config/s3.yml ", : path =>": class /: id /: style /: basename.: extension "' –

+0

Tôi chỉ sử dụng mặc định và giữ mô hình Nội dung trống, nhưng tôi đặt cược có một cách để có một bộ mặc định trong mô hình Nội dung. Tôi chưa thử. – Eric

2

Một nicer cách nhiều có thể được, (nếu sử dụng đang đối phó với hình ảnh):

class Image < ActiveRecord::Base 
    belongs_to :imageable, :polymorphic => true 
    has_attached_file :attachment, styles: lambda { 
    |attachment| { 
     thumb: ( 
     attachment.instance.imageable_type.eql?("Product") ? ["300>", 'jpg'] : ["200>", 'jpg'] 
    ), 
     medium: ( 
     ["500>", 'jpg'] 
    ) 
    } 
    } 
end 
+0

Câu trả lời của bạn có thực sự hoạt động không? attachment.instance.imageable_type là nil –

+0

@ArtemAminov Có nó hoạt động .. như tôi đang sử dụng nó trong một dự án của tôi. –

+0

có thể bạn có thể giúp tôi với dự án của tôi, vui lòng xem mã tại đây [link] (http://stackoverflow.com/questions/19901485/paperclip-polymorphic-styles) –

Các vấn đề liên quan