2009-12-07 38 views
36

Tôi mới đến đường ray nên xin lỗi nếu điều này thật dễ dàng. Tôi đang tự hỏi cách tốt nhất để tải lên hình ảnh và hiển thị chúng trong Ruby on Rails. Tôi có một blog và muốn có tùy chọn đính kèm hình ảnh khi tạo bài đăng.Tải Ảnh lên Ruby on Rails

Trả lời

3

Nhiều người khuyên bạn nên PaperClip. Có lẽ bạn muốn thử sử dụng điều đó trước.

7

Giả sử bạn không cần các tính năng ưa thích, không muốn thêm một sự phụ thuộc và muốn để lưu trữ các hình ảnh như một BLOB trong DB của bạn, bạn có thể làm điều gì đó như:

mẫu:

class Image < ActiveRecord::Base 
    def img=(input_data) 
    self.filename = input_data.original_filename 
    self.filetype = input_data.content_type.chomp 
    self.img = input_data.read 
    end 
end 

Bộ điều khiển:

class ImagesController < ApplicationController 
    def display_img 
    @img = Image.find(params[:id]) 
    send_data(@img.img, :type => @img.filetype, :filename => @img.filename, 
       :disposition => 'inline') 
    end 
end 

Here's a link đến một hướng dẫn hoàn chỉnh hơn.

+4

Tránh lưu trữ các đốm màu lớn trong cơ sở dữ liệu - hiếm khi xảy ra trường hợp đó là ý tưởng hay. – bensie

2

attachment_fu (http://github.com/technoweenie/attachment_fu) là một tùy chọn khác mặc dù cá nhân tôi muốn giới thiệu paperclip. Nó không yêu cầu Rmagick là một điểm cộng lớn, và nó hỗ trợ một số tính năng thú vị như tải lên S3 với cấu hình nhỏ.

3

CarrierWave có lẽ là giải pháp tốt nhất để tải lên hình ảnh trong Rails. Bài viết sau đây mô tả một giải pháp để tải lên hình ảnh bằng cách sử dụng CarrierWave trong khi các phép biến đổi hình ảnh được thực hiện liền mạch trong đám mây. Hình ảnh được tải lên được lưu trữ trên đám mây và được phân phối qua CDN. Không cần cài đặt RMagick, MiniMagick và ImageMagick. http://cloudinary.com/blog/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary

4

Nhiều người khuyên bạn nên sử dụng Carrierwave và tôi không phải là ngoại lệ nhưng tôi muốn chỉ ra một điều. Trên nhiều trang web được viết bằng RoR (nó rõ ràng không chỉ là vấn đề RoR) Tôi nhận thấy rằng yêu cầu gửi hình ảnh có thể đang chờ xử lý trong khoảng 2-3 giây và thậm chí nhiều hơn. nếu bạn đang sử dụng chủ đề hoặc không quan tâm nhiều về hiệu suất nhưng nó chắc chắn là nếu bạn đang sử dụng kỳ lân).Vì vậy, tôi sẽ giải thích làm thế nào để tránh điều đó bằng carrierwave:

1) Chọn một số công nhân nền cho ứng dụng của bạn (Tôi thường đi với Sidekiq)

2) Thêm carrierwave_backgrounder để Gemfile của bạn và cấu hình nó để làm việc với các bạn công nhân nền và carrierwave (tất cả mọi thứ trong readme của nó)

tôi thường có kiểm soát thư mục của tôi vì vậy tôi đi với store_in_background tùy chọn carrierwave_backgrounder mà xử lý và lưu trữ các hình ảnh trong hệ thống tập tin hoặc S3 hay bất cứ điều gì bạn đang sử dụng

3) Bây giờ, khi yo u cập nhật hình ảnh, quá trình xử lý và lưu trữ của nó chuyển sang nền, giải phóng thể hiện ứng dụng của bạn nhưng phải mất một lúc, trong hầu hết các trường hợp hơn 1 giây và bạn cần trả lại một số phản hồi cho người dùng

4) cách cung cấp cho người dùng một số phản hồi là trả lại javascript, trong đó bạn thay đổi ảnh cũ thành hình gif bằng spinner hoặc cái gì đó tương tự và đặt chức năng javascript SetInterval kiểm tra xem ảnh đã được xử lý hay chưa (carrierwave_background cung cấp chức năng có thể thay đổi cột boolean của mô hình của bạn thành đúng khi xử lý xong) gửi AJAX yêu cầu 2 giây một lần hoặc bất kỳ thứ gì bạn thích và thay đổi hình ảnh khi nó được xử lý.

Giờ đây, bạn có một phiên bản ứng dụng chưa được đồng bộ hóa và trải nghiệm người dùng tốt cùng một lúc.

PS Tôi mới vào đường ray và phát triển web cho mỗi gia nhập nên hướng dẫn này có thể có một số báo trước mà tôi đã bỏ lỡ

Hy vọng nó sẽ giúp ai đó.

Ồ, và nhân tiện, có viên ngọc mới này được gọi là refile, thật tuyệt vời và có thể là một lựa chọn thực sự tốt trong một số trường hợp.