一分一秒真剣勝負!

Ruby, Railsなど。Web系の技術ネタを充実させたい・・が、そうなるかは分からない。

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

入門Chef Solo - Infrastructure as Code


そろそろ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でrbenv,ruby-buildをインストール。

$ 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したら無事起動しました。良かった。