読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

Rails3で画像のアップロードとかサムネイル的なやつとかを『CarrierWave』でやってみる

Rails


*1
*2

Google先生に尋ねたら『file_column』とか『Paperclip』とかあるみたいですが、とりあえず『CarrierWave』を試してみた。
ナウなRails3はこういう場合に何を使うのか、どなたか教えていただきたいっす(´・ω・`)

基本的にCarrierWave の READMEと、『file_column から CarrierWave へ (基本編)』を参考にいろいろ端折ってやってみた。

下準備:ImageMagick をインストール

MacPortsの例

sudo port install ImageMagick

terminal

rails new carrierwave_test
cd carrierwave_test/

GemFile

add

gem 'rmagick'
gem 'carrierwave'

terminal

bundle install
:
rails generate scaffold User name:string avatar:string
:
rails generate uploader Avatar
      create  app/uploaders/avatar_uploader.rb
rake db:migrate

app/uploader/avatar_uploader.rb

# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end


  process :resize_to_fill => [100, 100]

  version :thumb do
    process :resize_to_fill => [50,50]
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end


end
引用

Sprockets のモジュールを読み込んでいるのは、Rails 3.1.x の Asset Piplineに対応する為です。

一応、「現状、とりあえずこうしておこうか」という対処ですので、この先変更される可能性もあります。

2011-11-29 - 篳篥日記

app/models/user.rb

class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
  validates :name, presence: true
end

app/views/users/_form.html.erb

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :avatar %><br />
    <% if @user.avatar? %>
      <%= image_tag @user.avatar.thumb %>
      <%= f.hidden_field :avatar_cache if @user.avatar_cache %>
    <label><%= f.check_box :remove_avatar %>Remove avatar</label>
    <% end %>
    <%= f.file_field :avatar %><br />
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

app/views/users/show.html.erb

<p id="notice"><%= notice %></p>

<p>
  <b>Name:</b>
  <%= @user.name %>
</p>

<p>
  <b>Avatar:</b>
  <%= image_tag @user.avatar %>
</p>


<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>

app/views/users/index.html.erb

<h1>Listing users</h1>

<table>
  <tr>
    <th>Name</th>
    <th>Avatar</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @users.each do |user| %>
  <tr>
    <td><%= user.name %></td>
    <td><%= image_tag user.avatar.thumb %></td>
    <td><%= link_to 'Show', user %></td>
    <td><%= link_to 'Edit', edit_user_path(user) %></td>
    <td><%= link_to 'Destroy', user, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New User', new_user_path %>

*1:MacOSX10.7, ruby19.2, rails3.1.3, carrierwave0.5.8

*2:修正:全体的にコード短くした