티스토리 뷰
Rails 4 에서 Paperclip 과 Image Magick 으로 파일 업로드 및 이미지 처리를 할 수 있습니다.
Paperclip 을 이용한 프로필 사진 기능을 만들어보도록 하겠습니다.
Requirements
1. Ruby 버전 1.9.2 이상
2. Rails 버전 3.0 이상
3. ImageMagick 설치
1. ImageMagick 설치
$ sudo apt-get install imagemagick
$ sudo apt-get instal libmagickwand-dev
2. Paperclip gem 설치
Gemfile 에 추가
gem "paperclip", "~> 4.1"
$ bundle install
3. User 모델에 컬럼추가
$ rails g paperclip user avatar
$ rake db:migrate
을 하게되면 4가지의 columns 값들이 추가되게 됩니다.
avatar_file_name (string)
avatar_file_size (int)
avatar_content_type (string)
avatar_updated_at (datetime)
3. Model 적용
User.rb에 추가
styles 에는 업로드 사진을 해당 크기를 지정해서 변수로 사용할 수 있습니다.
나중에 view 에서 :medium 을 인자로 주면 300x300 사이즈로 출력, :thumb 을 인자로주면 100x100 으로 사진이 출력이됩니다.
content_type 은 이미지 파일외 업로드가 안되도록 설정을 해두고
size 에서 파일 크기가 10 mega를 넘지 않도록 설정을 해두었습니다.
class User < ActiveRecord::Base has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png" validates_attachment_content_type :avatar, :content_type => /^image\/(jpeg|png|gif|tiff)$/
validates_attachment_size :avatar, :in => 0..10.megabytes
end
4. New / Edit View 적용
<%= form_for @user, :url => users_path, :html => { :multipart => true } do |form| %> <%= form.file_field :avatar %> <% end %>
5. Controller 적용
strong parameters 로 :avatar 속성을 적용합니다.
def create @user = User.create( user_params ) end private # Use strong_parameters for attribute whitelisting # Be sure to update your create() and update() controller methods. def user_params params.require(:user).permit(:avatar) end
devise gem 을 이용해서 사용하시는 분은
application_controller.rb 에서 아래처럼 추가시켜주면 됩니다.
befor_filter :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << : avatar
devise_parameter_sanitizer.for(:accout_update) << :avatar
end
6. Show View 적용
사진을 출력하고자 하는 뷰에서 아래처럼 적어주면 됩니다.
<%= image_tag @user.avatar.url %> <%= image_tag @user.avatar.url(:medium) %> <%= image_tag @user.avatar.url(:thumb) %>
위에서 설명했듯이 @user.avatar.url 의 경우 업로드 사진 크기 그대로 출력, :medium 은 위에서 설정한 300x300, :thumb 는 100x100 으로 출력되게 됩니다.