railsでcarrierwaveを使った画像投稿機能を実装していきましょう。 paperclipっていうgemもあるけど、今回はcarrierwaveでやります。確かcarrierwaveの方が細かい設定ができた気がする。
carrierwaveを使う前の準備
まずはサンプルとしてアプリケーションを作成。mysqlを普段使っているのでデータベースはmysqlを使いますよーというオプション付き。
rails new carrierwave-sample -d mysql
rake db:create
機能を試すのにいろいろ作るのは面倒くさいのでscaffoldで。
rails g scaffold image
gemfileのcarrierwaveを記述。
gem 'carrierwave'
bundle install。
carrierwaveの設定
ここからがcarrierwaveの設定。
まずは、アップローダーを作ろう。確かアップローダーの名前は何でもいいけど、テーブル名のカラムに一致させるのが慣習だっけ? imagesテーブルのimageカラムに画像をアップするとしてアップローダーの名前はimageにしよう。(モデルの名前もっと分かりやすくPhotoとかにすればよかった。)
rails g uploader Image
app/uploaders/image_uploader.rbっていうものができる。
カラムを追加していなかったので追加。
class CreateImages < ActiveRecord::Migration def change create_table :images do |t| t.text :image t.timestamps end end end
rake db:migrateでデータベースに反映。
モデルファイルにuploaderの記述を追加。
class Image < ActiveRecord::Base mount_uploader :image, ImageUploader end
viewをファイルがアップロードできるように変更
<%= form_for(@image) do |f| %> <div class="field"> <%= f.label :image %><br> <%= f.file_field :image %> </div> <%= f.submit %> <% end %>
コントラーラーの記述も、imageを受け取れるように変更。
def create Image.create(image_params) redirect_to :action => "index" end def image_params params.require(:image).permit(:image) end
redirect_to :action => “index"として投稿したらindexのページに飛ぶように設定。 このページで投稿した画像を見ることができるようにしましょう。
<% @images.each do |image| %> <%= image_tag(image.image) %> <% end %>
とりあえずこんな感じで表示はされるはず。imageの羅列ですごい分かりにくい笑