any_ofでorの結果を取得したいのに、結果はandになってしまう、という場合
User.any_of(:created_at.gte => 1.week.ago, :name => /^j/)
上記のコードは、1つのハッシュをany_ofとして渡している。any_ofはハッシュを複数渡すのが正解なので、以下のコードが正しい。
User.any_of({:created_at.gte => 1.week.ago}, {:name => /^j/})
よくミスするのでメモ。
any_ofでorの結果を取得したいのに、結果はandになってしまう、という場合
User.any_of(:created_at.gte => 1.week.ago, :name => /^j/)
上記のコードは、1つのハッシュをany_ofとして渡している。any_ofはハッシュを複数渡すのが正解なので、以下のコードが正しい。
User.any_of({:created_at.gte => 1.week.ago}, {:name => /^j/})
よくミスするのでメモ。
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で目指せ、情熱エンジニア(10):コントローラとモデルをリファクタリングする
前回用意したRailsアプリのコントローラのテスト(スペック)をもとに、今回はコントローラとモデルのリファクタリングの実例を紹介します。
http://www.atmarkit.co.jp/ait/articles/1305/28/news003.html
Mongoidで複数のIDを一気に取得したい時は、IDを入れた配列をfindに渡す。
ids = ['1234567890', '098765321', '2357111317'] User.find(ids)
before_save, after_saveといったコールバックを実行せずにフィールドの値を更新するには、set
メソッドを利用する。after_saveの中で値を更新したい時に便利。
以下は例。
item = Item.first item.set(:description, "It's so nice!")
簡単ですね。
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
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で文中にコロンを入れたい時にどうすればよいか。試しにコロンを二つ重ねて::にしたら以下のようなエラーが出てしまってダメだった。
Psych::SyntaxError: (/myproject/config/locales/en.yml): could not find expected ':' while scanning a simple key at line 0000 column 00
単純な話だけれど、YAMLでコロンをエスケープするには、バックスラッシュを前に付ければいい。「\:
」というようにすれば、文中でもコロンを使える。
Railsのrenderメソッドを呼び出す時にlocalsを使ってローカル変数を渡そうとした時、ActionView::Template::Errorで「dynamic constant assignment」とエラーが起きてしまった。
続きを読む Railsのrenderでlocalsを使うとActionView::Template::Errorが起きる