티스토리 뷰


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 으로 출력되게 됩니다.



댓글