Rails4にアップデートした
Rails4にアップデートする情報は十分にあるので、あえて書くことは無いんですが、今やってるプロジェクトでRails3.2.14からRails4に上げた時のメモ。
基本的にRails3のうちにstrong_parametersさえ対応しておけば大したことはないというのが感想。
問題は使っているgemがRails4に対応しているかどうかですね。
ほぼ全てのgemが対応済みだったり、対策方法があってスムーズに移行が進んだのですが、ちょっとはまったのがglobalize3でした。rails4というブランチがあるので、それをGemfileで指定してbundle installしたら以下のエラーが発生。
Bundler could not find compatible versions for gem "activerecord": In Gemfile: globalize3 (>= 0) ruby depends on activerecord (~> 3.0) ruby rails (= 4.0.0) ruby depends on activerecord (4.0.0) Bundler could not find compatible versions for gem "rails": In Gemfile: globalize3 (>= 0) ruby depends on rails (~> 3) ruby rails (4.0.0)
調べてみたらpaper_trailとの依存関係が問題で、paper_trailを使っていなくても同じくrails4ブランチを指定してGemfileに追記すればおkでした。
Rubyも2.0になってるし、とりあえずは安心。
入門Chef Solo補足メモ
入門Chef Solo - Infrastructure as Code
- 作者: 伊藤直也
- 出版社/メーカー: 伊藤直也
- 発売日: 2013/03/11
- メディア: Kindle版
- 購入: 16人 クリック: 1,027回
- この商品を含むブログ (12件) を見る
そろそろChefでも覚えるかって時に伊藤直也さんが「入門Chef solo」を出版されたので購入しました。
Chefを覚えようとして最初の段階でハマッて諦める人が多いみたいですね。僕はいきなり本書を読みながら進めていったので殆ど止まること無く覚えられましたが、Chefのマニュアルを見た印象では確かにいきなり詳細過ぎる解説を見せられても分かりにくいかなー、と感じました。たったの890円だし、Chefをこれから覚えたい人は買って損は無いと思います。
補足
knife-soloの最新版インストール時の解説で、git cloneしてrake installと書かれていましたが、自分の環境ではjsonが入らずにエラーになりました。gem update --systemを実行し、gem installでオプションの--preをつければ0.3.0が入ります。
$ gem update --system $ gem install knife-solo --pre
knife solo init実行時にuninitialized constant KnifeSolo::Pathname (NameError)が発生しました。knife-soloのインストール先のknife-solo.rbでrequire 'pathname'を追記して下さい。例えばrbenvを使っている環境なら以下のファイルになります。
# require 'pathname' を追加 ~/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/knife-solo-0.3.0.pre3/lib/knife-solo.rb
tmuxが.tmux.confを読み込まない(CentOS)
CentOSでtmuxを起動した時に ~/.tmux.conf を読んでくれねーなー、と思っていたけど
C-b : source-file ~/.tmux.conf
tmuxを起動してsource-fileで設定ファイルを読み込んでからタブを開いてみたらうまく起動した。
なんでだろう。Macだとこんな事しなくても良かったのに。
ActiveResourceでバリデーションのエラーメッセージを送信する方法
よく見るサンプルコードみたく以下のように書くとダメ。
if @hoge.save format.json { render :json => @hoge, :status => :ok } else format.json { render :json => @hoge.errors, :status => :unprocessable_entity } end
エラーを返す時はハッシュで:errorsをつけてやるとおkでした。
if @hoge.save format.json { render :json => @hoge, :status => :ok } else format.json { render :json => {:errors => @hoge.errors.to_json}, :status => :unprocessable_entity } end
クライアント側ではこれをやってやるだけで取得できます。Railsが勝手にやってくれると思い込んでたんだけど、こうしないとダメらしい。なんか面倒だな。@hoge.errors.to_jsonの#to_jsonは省略できないものか。。
fatal: Could not parse object <Capistrano>
Gitサーバの参照先を変えたらCapistranoでエラー。
** [server_name :: out] Warning: Permanently added 'ip address' (RSA) to the list of known hosts.
実行ログを見ると旧サーバのIPを参照しているようだ。
色々とググったら以下のサイトを見て解決。
http://www.willpink.co.uk/post/1074709512/fatal-could-not-parse-object-github-capistrano
set :deploy_via, :remote_cacheをコメントアウトしてデプロイできました。
デプロイが終わったら再びコメントをはずして元通り・・・というわけではなく、デプロイ先サーバの
<deploy_to>/shared/cached-copy/.git/config
このファイルのGitサーバを書き換えないとダメですよっと。
rvmからrbenvへ移行
実装がコロコロ変わったりしてupdateしたら動かなくなったりするとか叩かれているrvmですが、実際僕も同じ現象に遭遇した事があり、rubyのバージョン管理をrbenvに移行することにしました。37signalsの中の人が作っているので、まあ普及するかなと。OSはLionです。
rvm削除。
$ rvm implode $ rm -rf ~/.rvm
$ brew install rbenv ruby-build
.bash_profileに以下を追加
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"
よし、rubyをインストールだ・・・!と、思ったらエラー。
$ rbenv install 1.9.2-p290 ERROR: This package must be compiled with GCC, and we couldn't find a suitable `gcc' binary on your system. Please install GCC and try again. As of version 4.2, Xcode is LLVM-only and no longer includes GCC. You can install GCC with these binary packages on Mac OS X: https://github.com/kennethreitz/osx-gcc-installer/downloads BUILD FAILED
どうやらLionからgccを使わなくなった様子。指示通りgccをDL&installで問題なく入りました。
使い方はrbenv + ruby-buildのインストール方法 - 223 Softwareで基本的なコマンドがよくまとまっています。詳しく知りたかったらgithubを参照。
で、そのままRailsを立ち上げたらエラー発生。
NoMethodError (undefined method `clear_active_connections!' for ActiveRecord::Base:Class):
ちょっと焦って色々探したのですが、bundle installした時にrvmを使っていたのが原因かな?と思ってvendor/bundleをrm -rfした後にbundle installしたら無事起動しました。良かった。