maeshimaの日記

メモ書きです

rails

validates_confirmation_of

validates_confirmation_of は valid? ではチェックされず、saveの時にチェックされるっぽい confirmation用の属性がnilのときはチェックされないみたい。

複数ユーザ毎のコメント数を調べるコード

復習用エントリ。これは絶対に覚えなくてはならないコード! user = User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id") 各ユーザ毎に user.comments とすると、クエリがユーザ数分発行され…

ActiveRecord::RecordInvalid と ActiveRecord::RecordNotSaved

ActiveRecord::RecordInvalid を手動で raise するには引数として model オブジェクトが必要。 下記のように、validationに失敗したオブジェクトを取得できる begin complex_operation_that_calls_save!_internally rescue ActiveRecord::RecordInvalid => i…

Arrayを分割する系のメソッド

railsで拡張されたメソッド。 Array#in_groups(n) n個の配列を持つ配列を返す。 Array#in_groups_of(n, fill_with = nil) n個の要素を持つ配列を持つ配列を返す。each_slice と似てるけど、配列(の配列)を返すメソッドであるというのと、fill_with に何か値…

SCSSの関数で出来ること

lighten(), darken() に感動したので、他にSCSSでなにが出来るか気になった。Module: Sass::Script::Functionsを見てざっくりおおまかにまとめました。 出来ること 赤色、緑色、青色の調整 色相、彩度、光度の調整 透明度の調整 明るさの調整 二色をまぜる …

Rails 3.1 で annotate_models

Rails 3.1 だと annotate_models がうまくうごかないっぽい -> annotate のhead なら大丈夫だったctran/annotate_models - GitHub

sunspotで検索する

Working with search - GitHubの意訳。 検索ことはじめ Sunspot.search メソッドで検索できる。引数は検索で使う一つ以上のクラス(モデル)。オプションでブロックに検索条件を書ける。一番簡単な例としては、渡したクラスのインスタンス全部を検索する物があ…

sunspot-rails-tester

justinko/sunspot-rails-tester - GitHubのREADMEの意訳。この gem は特定の箇所のテストで solr をオンにするためのもの。solr を使用せず、sunspot を stub 化することで不必要なインデックス構築を避けている。RSpec2 の spec_helper.rb の例。 $original…

sunspot_rails

sunspot_rails/README.rdoc at master from outoftime/sunspot - GitHubの意訳。Sunspot::Rails は Sunspot の Solr 検索を Rails に統合するためのプラグイン。下記のような機能を提供する。 config/sunspot.yml で sunspot の設定が出来る ActiveRecord を…

sunspot(solr)の設定方法

Advanced Fulltext Search Configuration - GitHubの意訳。デフォルトの設定だと、スペースか他の区切り文字で区切られている前提。区切りにはStandardTokenizerというのを使ってる。大文字小文字を区別させないようにするためにはLowerCaseFilterというのを…

sunspotのチュートリアル意訳

インストール solrのインストールはmacなら brew install solr でOK。Rails側はまずGemfileに gem 'sunspot_rails' を書いて bundle install。それから rails g sunspot_rails:install で config/sunspot.yml を作成。 solr のインスタンスを起動 下記の rak…

thinking_sphinx の設定

基本 config/sphinx.yml に設定を書く。下記のように database.yml っぽく environment 毎に設定を分けることが出来る。 development: port: 9312 test: port: 9312 production: port: 9312 rake ts:conf などとすると、このファイルを元に設定ファイル(conf…

ASCIIcasts - Template Inheritance

ASCIIcasts - “Episode 269 - Template Inheritance”を見て。以前、Edge Rails.info :: Template Inheritanceを見て、3.1 から 「デフォルトのビューの位置にファイルがない場合は、親のコントローラのビューを見る」という仕様が追加されるのは知ってた。で…

3.1のストリーミング機能の話

Automatic Flushing: The Rails 3.1 Plan « Katz Got Your Tongue?を読んで。3.1のストリーミング機能の実装が大体どんな感じか、非常に詳しく書かれていてためになった。Fiberを使っている手前、1.9でしか使えないのね。

thinking_sphinx の rake コマンドまとめ

インデックスとコンフィグの作成 下記のうちのどれでもOK。 rake thinking_sphinx:index rake ts:index rake ts:in デフォルトでは、インデックスの作成に加えてコンフィグファイルも生成される。インデックスの作成だけしたいときには rake thinking_sphinx…

railsがTimeに追加してる便利メソッド

ActiveSupport::TimeWithZoneに追加されてる。 today? past? future? between?

thinking_sphinx 利用時のテスト方法

transactional fixtures をオフにしないと search メソッドは値を返さないそうな。 cucumber 1.3.2 から、thinking_sphinx は cucumber と連携しやすくするためのヘルパーメソッドを用意した。features/support/env.rb に下記の二行を足す。 require 'cucumb…

attributeの変更

changed? はともかく _was とかすっかり忘れてた><attributeの変更確認 - うんたらかんたら日記

メタプログラミングRuby 第3章

ブロックは定義された場所の束縛を保持する。 束縛とはローカル変数、インスタンス変数、selfなどの情報のこと スコープゲートは module class def class を Class.new {} にしたり、def を define_method {} にしたりすることでスコープをフラットにするこ…

今週のrailscasts - Authentication in Rails 3.1

#270 Authentication in Rails 3.1 - RailsCastsを見て。 Railsでのベーシック認証 secure_password force_ssl の三つについてだった。ベーシック認証以外は知ってたので省略。 ベーシック認証 3.1 から controller に下記のように書くだけでベーシック認証…

Capybaraをコンソールで試す

こんな感じで試せる>|ruby|| session = Capybara::Session.new(:rack_test, YourApp::Application) session.visit "/" session.fill_in "login", with: "login" |

今週のASCIIcasts - SASS Basics

ASCIIcasts - “Episode 268 - SASS Basics”を見て。 SCSSの仕様 ネストが出来る a:hover みたいなやつは &:hover のように & にするとネストできる $main-color: #FFFFFF; みたいに $ 使うと変数として使える 関数が用意されている。例えば darken(#FFFFFF, …

ASCIIcasts - CoffeeScript Basics

ASCIIcasts - “Episode 267 - CoffeeScript Basics”気になったとこだけメモ this は @ に置換 三項演算子は if then else に置換が可能 coffee script 中のエラーもコンソールに出力してくれる

Rails 3.1 の mass assignment

attr_accessible に :as オプションが付けられるようになったらしい。 class Project < ActiveRecord::Base attr_accessible :name, :as => :admin end のようにすると、 @project.update_attributes(params[:project], :as => :admin) のように、変更側で同…

モデル内で自分のテーブル名を返すメソッド

ActiveRecord::Base#table_name

3.1.0.beta1の action_dispatch/url_for.rb のコメントの意訳

ActionDispatch::Routing モデルとかでURLを生成したい場合は、ActionController::UrlForを見るといい。 知ってると思うけど ActionController::Base#url_for はリンクを生成する。link_to や url_for は水面下で ActionController::UrlFor、特に ActionCont…

javascript_include_tagは複数の引数をとれる

一つだけかと思ってた>< javascript_include_tag "common.javascript", "/elsewhere/cools" # => <script type="text/javascript" src="/javascripts/common.javascript"></script> <script type="text/javascript" src="/elsewhere/cools.js"></script>

ActionView::Helpers::TextHelper

Railsはかゆいところに手が届くなー。メモ truncate(text, *args) textが:lengthで指定した文字数より大きかった場合に、:lengthで指定した文字になるまで切り詰めて、:omission(デフォルトは"...")を末尾に付ける。これどうせバイト単位で日本語だとうまく…

ログ削除のrakeコマンド

log配下の*.logのサイズを0にするrakeコマンド rake log:clear

RailsCasts - Testing JavaScript with Jasmine

Railscasts - Testing JavaScript with Jasmineを見て。jsのユニットテスト環境 jasmineについて。基本的にRspecライクな書き方でjavascriptのユニットテストを実行することができる。すごく使えそう!!! rake jasmine でサーバ立ち上げてアクセスするとテ…

seeds.rbについて雑感

seeds.rbはmigrationにデータを変更するコードを書くのをやめよう!という思想が入ってるらしいけど、データの初期化はともかく、運用途中でデータを変更するのは結構めんどそう。マスタデータ変更系でもseeds.rb使った方が良いんだろうかRails 2.3.4で追加…

auto_link

Rails3.0.6ではauto_linkの脆弱性が修正されたらしい。auto_linkは文字列中にあるURLやメールアドレスにaタグ付けて返すメソッド。あんまり使わないから忘れがちなんだけどこの際覚えよう。 post_body = "Welcome to my new blog at http://www.myblog.com/.…

空文字をカラムに代入したときの挙動

textやstringのカラムに空文字代入して保存したときにnilになるのか空文字になるのかよくわかってなかった。空文字代入のときは空文字が保存されるみたいね。integerや datetime は空文字代入したら nil になる(当たり前だけど)。

ASCIIcasts - Decent Exposure

ASCIIcasts - “Episode 259 - Decent Exposure”を読んで。decent_exposureという、コントローラでインスタンス変数に値をセットする部分を簡単にするgemについての記事。 def show @article = Article.find(params[:id]) end のような、コントローラ中に書く…

Paperclipのstyleの記述方法

resizeだけ指定したいときは文字列だけでいい has_attached_file :avatar, :style => {:large => "640x640>"} 拡張子を指定しないといけないときは配列 has_attached_file :avatar, :style => {:large => ["640x640>", "jpg"]} ハッシュでもいい。ハッシュだ…

PaperClip::ClassMethods#has_attached_file

ドキュメントの意訳。has_attached_fileはクラスにファイル用の属性を追加する。通常はどこかに置いてあるファイルか、もしくはユーザがアップロードしたファイル。その属性はPaperclip::Attachementオブジェクトを返す。これによってファイルをモデルの普通…

datetime形式の入力を厳密にチェックしたい場合

datetime形式のパラメータは params[:hoge][:date(1i)], params[:hoge][:date(2i)], params[:hoge][:date(3i)] のように分かれてくる。このパラメータをmass assignmentでdatetime形式のカラムの属性に代入すると、railsが気を利かせて解釈してくれてDateTim…

ActiveRecored::Base#save!についての雑感

これまでActiveRecored::Base#save!を多用してたけど、複数のモデルを一度に保存する場合、save!だと一つの「モデルのバリデーションしか行われない→エラーメッセージが一部しか表示されない」という弊害があるな。そういうときはsaveメソッドを使うといいね…

after_validation

validateの後に実行されるコールバック。validate中にエラーチェックに引っかかる項目があっても実行される。エラーをチェックする条件が複雑なものを別メソッド(やモジュール)に出して、validationするタイミングは同じにしたいようなときに使える・・・と…

migration中に変更したカラムを使いたい場合

ActiveRecord::Base#reset_column_informationを実行して、カラムの情報を一度リセットしないとエラーになってしまう。下記のソースはrailsのドキュメントからの引用。 class CreateJobLevels < ActiveRecord::Migration def self.up create_table :job_leve…

今週のRailscasts - Decent Exposure

Railscasts - Decent Exposureを見て。下記のような、よくコントローラ中に書かれる、インスタンス変数にオブジェクトを代入する処理をまとめてかけてDRYにするgem。 @articles = Article.all ざっと見た感じではなかなか使えそうな気がした。コントローラを…

validates_uniqueness_ofを付けるときにはDBのindexにもunique制約つけるべき

メモ。validates :uniquenessはuniquenessを保証しないのでDBにindexをつけましょう!

renderのオプション

fileの方はデフォルトでlayoutが適用されない templateの方はデフォルトでlayoutが適用される render :file => "hoge/fuga" render :template => "hoge/fuga"

ポリモーフィック関連

ポリモーフィック関連 - maeshimaの日記

バリューオブジェクト

一つのモデル内にたくさんのカラムを設定する時なんかには使えそう? バリューオブジェクト - maeshimaの日記

after_initialize, after_find

メソッドを定義しておくと、それぞれnewしたとき、findしたときの挙動をフックできるらしい after_initializeに関して - カノ エ ノ メモ - cucumberグループ

controller内でviewのメソッドを使う方法

ドキュメント見た限りではRails3限定っぽい。view_contextメソッドにチェーンするとcontroller内でもviewのメソッドが使える view_context.link_to("hoge", ...) 参考 Railscasts - Undo with Paper Trail

verify

verify - maeshimaの日記

Array#wrap

railsで拡張されてるメソッド。引数がArrayじゃない場合に配列でラップして返す。

railsの脆弱性

Riding Rails: CSRF Protection Bypass in Ruby on Railsを読んで。ざっくりメモ。 CSRFの脆弱性あり 2.3.11にあげると、これまでCSRFのチェックで500になってたのが session reset に変更になる handle_unverified_requestメソッドをオーバーライドすると挙…