2012年8月3日金曜日

Rails3でmongoidでcarrierwaveを使う!

最近mongoDBにはまりすぎてやばいです。
mongoDBスバラシキ!
いろんなサイトでmongomapperでcarrierwaveを組み合わせているのですが、
なかなかmongoidでcarrierwaveでマッチするサイトが見つからなかったので、メモ。


rails new hogeしたあとから。
あとごめんなさい、routes.rbの設定とpublic/index.htmlの削除は自分でお願いしますw
gemfile sqlite3の下あたりにでも。
gem 'mongoid'
gem 'bson_ext'
gem 'carrierwave'
gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
gem 'rmagick'



$ bundle install
$ rails g mongoid:config
$ rails g scaffold article name:string content:text
invoke mongodbされていることを確認

$ mongod
$ rails s
mongodbがちゃんと動いていることを起動確認

次にcarrierwaveとドッキングさせます。
ActiveRecordのようにrake db:migrateは不要のため、カラムを追加したいときは簡単です。

$ rails g uploader image

models/articles.rb

class Article
  include Mongoid::Document
  field :name
  field :content
  field :image    #追加、mongodbはデフォルトでtype => stringがつくので、typeは書かなくて大丈夫です
  
  mount_uploader :image, ImageUploader   #追加
  validates :name, presence: true  #お好みで
end
===================================

views/articles/_form.html.erbに以下を追加
  
<%= f.label :image %>
<%= f.file_field :image %>
=================================== views/articles/show.html.erbにimageを表示させるために以下を追加 Image: <%= image_tag @article.image_url.to_s %> =================================== views/articles/index.html.erbにもimageを表示させるために以下を追加 <%= image_tag article.image_url(:thumb).to_s%> =================================== uploaders/image_uploader.rbに include CarrierWave::RMagick  6行目をコメントイン 39行目 version :thumb do process :resize_to_limit => [200, 200]  #resize_to_limitに書き換え end
もしこれでkey? nill なんちゃらとかでるようだったら、 一度rails sを再起動させてやると戻るかもしれません ActiveRecordを使う場合よりも圧倒的に簡単に書けるようになったかと思います。 これでrake dbのかけ忘れは確実になくなったとw