Rails + HAMLの環境で、URL Helperを使いながらjQuery Templateを使う

JavaScirptで利用できるテンプレートエンジンに「jQuery Templates」がある。これにはjquery-tmpl-railsというgemも用意されていて、すぐに使い始めることができる。使い方のチュートリアルとしてはブログ記事”jQuery公式のテンプレートplugin 「jQuery Templates」-JavaScript Library Archive“が分かりやすい。

railsのurl helperを使うと、routes.rbに書かれた内容に沿ってURLを自動で生成してくれる。例えば、routes.rbにresource :booksと書いていた場合、指定のIDのBookのページのURLを取得するにはbook_path(:id)と書けばよい。詳しくは以下参照。
2.3 Paths and URLs – Ruby on Rails Guides: Rails Routing from the Outside In
この時、:idに相当する部分は自動でURLエンコードされる。ここをjQuery Templatesで書き換えたい場合、ダラー( $ )と波括弧( { と } )がエスケープされてしまう。それを避ける方法。

あまり綺麗な書き方ができなかったので、もっとベターな方法(例えばURLHelperの機能を使う時にURLエンコードを禁止するような方法)があったらどなたか教えてください。

Rails: コントローラとモデルのリファクタリング

railsのリファクタリングについて具体的な事例が掲載されていて分かりやすかったのでメモ。

Railsで目指せ、情熱エンジニア(10):コントローラとモデルをリファクタリングする
前回用意したRailsアプリのコントローラのテスト(スペック)をもとに、今回はコントローラとモデルのリファクタリングの実例を紹介します。
http://www.atmarkit.co.jp/ait/articles/1305/28/news003.html

Mongoidでcallback(before_save等)を呼ばずにupdateする

before_save, after_saveといったコールバックを実行せずにフィールドの値を更新するには、setメソッドを利用する。after_saveの中で値を更新したい時に便利。
以下は例。

item = Item.first
item.set(:description, "It's so nice!")

簡単ですね。

http://mongoid.org/en/mongoid/docs/persistence.html#atomic

ActiveRecordでcallbackを呼ばずにupdateする

ActiveRecord::Baseを継承したクラスの中で、before_save, after_saveなどを書くと、保存前や保存後に呼び出されるメソッドを指定できる。しかし、これらのコールバックの中で例えばsaveメソッドを実行してしまうと、stack level too deep (SystemStackError)というようなエラーが起きてしまう。

参考にしたのは以下のページ:
ruby on rails – Skipping callbacks and validation – Stack Overflow

以下のドキュメントにリストアップされているメソッドは、こういったコールバックを呼び出さずにスキップして、updateをかけることができる。
http://guides.rubyonrails.org/active_record_validations_callbacks.html#skipping-callbacks

続きを読む ActiveRecordでcallbackを呼ばずにupdateする

I18n.tで変数を使う/動的に翻訳を増やす

I18n.tを使ってyamlから文字列を読み込んでいる時、文中に変数名を入れたいことがある。その場合は、yaml側では変数名を%{ }と囲んで、I18n.tの引数としてハッシュを渡せばよい。詳しくは、以下のドキュメントに記載されていた。

http://guides.rubyonrails.org/i18n.html#interpolation

上記URLからサンプルコードを引用:

I18n.backend.store_translations :en, :thanks => 'Thanks %{name}!'
I18n.translate :thanks, :name => 'Jeremy'
# => 'Thanks Jeremy!'

YAMLでコロン(:)をエスケープする

YAMLで文中にコロンを入れたい時にどうすればよいか。試しにコロンを二つ重ねて::にしたら以下のようなエラーが出てしまってダメだった。

Psych::SyntaxError: (/myproject/config/locales/en.yml): could not find expected ':' while scanning a simple key at line 0000 column 00

単純な話だけれど、YAMLでコロンをエスケープするには、バックスラッシュを前に付ければいい。「\:」というようにすれば、文中でもコロンを使える。

Capistranoでdeployすると”fatal: Could not parse object”と出る

Capistranoで、新しく作ったブランチをデプロイしようとしたらエラーが起きた。例えば以下のような感じ。

$ cap staging deploy -s branch=mybranch
    triggering load callbacks
  * 2013-04-25 11:51:27 executing `staging'
    (中略)
    [my-deploy-server.example.com] executing command
 ** [my-deploy-server.example.com :: out] fatal: Could not parse object '4n58rzpt8w4iuvzdau5hylb82gsxxvg7hhcjyucc'.
    command finished in 7935ms

“fatal: Could not parse object”の行は赤字で表示される。この問題の原因は、Capistrano側で設定されているgitのリポジトリに引数で指定されたブランチが存在していないことだった。自分の場合は、ローカルでちゃんと$ git push origin mybranchを実行してから再度cap deployを実行することで、問題が解決した。