Paperclipの画像を扱うクラスをimageにしたらハマった
公式はavatarというクラス名でUsageを解説しているけど、
自分の場合は、avararという名前よりもimageという名前の方がしっくりしたのでimageモデルに画像を持たせることにした。
アップロードをすることができたのだけど、urlメソッドが見つからない。なので画像が表示されない。
Image.find(1).url => NoMethodError: undefined method `url'
urlメソッドは、ファイルパスを返すので以下のように使うはずだった。
Image_tag image.url
よく見ると、urlメソッドを送っているレシーバーは、ActiveRecordのImageインスタンスだった。
urlメソッドが持っているオブジェクトは、Imageインスタンスのimageメソッドが返すPaperclip::Attachmentインスタンスという。
ややこしい。
gemの出すWarnignを消したい
gemのWaringログがターミナルに溢れていたのでWarnignがでないようにgemをアップロードしました。
warningログは以下のようなやつ。
DEPRECATION WARNING: Returning a hash from a #scope or #default_scope block is deprecated. Please return an actual scope object instead. E.g. scope :red, -> { where(color: 'red') } rather than scope :red, -> { { conditions: { color: 'red' } } }. (The scope was defined at /Users/retina_koji/.rvm/gems/ruby-2.0.0-p0/gems/ancestry-1.3.0/lib/ancestry/has_ancestry.rb:51.). (called from new at /Users/retina_koji/dev/actindi/rails//app/controllers/admin/books_controller.rb:22)
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead. (called from find_node at /Users/retina_koji/dev/actindi/rails/en-park/app/models/category.rb:38)
rubygemsリポジトリにはまだアップロードしていないけど、gibhub上ではだいたい解決していることが多いっぽいので、Gemfileで該当githubリポジトリ名を名指してbundle updateすれば最新になってwarnigログが消えるのでは。
gem 'ancestry', github: 'stefankroes/ancestry'
すっきりしました。
ActiveRecordのid自動採番を設定し直す
(ActiveRecordに限った話ではないんですが)
環境
postgresql (9.2.3)
activerecord (4.0.0.beta1)
概要
seed.rbだとかで訳あって、本来ならインクリメントされていくidに対して数値を指定してレコードを作成した場合、のちのちでidが被ってしまうのでそれを避けるために、シーケンスを降り直す方法を書く。
# db/seed.rb Word.create(id: 1) Word.create(id: 2) Word.create(id: 3) . . . connection = ActiveRecord::Base.connection(); connection.execute("select setval('word_id_seq',(select max(id) from words))")
$ rails console Loading development environment (Rails 4.0.0.beta1) [1] pry(main)> Word.create # ←idが最大値を振ってくれる