Rails tips vol1
最近 Rails をいじっていていろいろ書き留めたメモ。変なこと書いてたら突っ込んであげてください。
設定値はどこに書くべきか?
- とりあえずenvironment.rb に書いてみたらコードからもテストからも見えた。
- きちっとした人はAppConfigに書くらしい。たしかにこっちに切り替えたらすっきりした。yaml で書けるし。簡単に書くと以下。
- config/settings.yml とかを作る。それぞれの環境に応じた設定値を書く。
development: default_bg_image: "viola.jpg" default_layout: "landscape" base_bg_path: "/images/bg_img/" test: default_bg_image: "viola.jpg" default_layout: "landscape" base_bg_path: "/images/bg_img/" production: default_bg_image: "viola.jpg" default_layout: "landscape" base_bg_path: "/images/bg_img/"
-
- config/initializers/00_load_config.rb を作る。先ほど書いた yml を AppConfig に読み込むようにする。
AppConfig = YAML.load_file("#{RAILS_ROOT}/config/settings.yml")[RAILS_ENV].symbolize_keys
-
- ソース内からは AppConfig[:default_bg_image] とかって見える。便利!
- 詳しくは http://d.hatena.ne.jp/babie/20100520/1274369782
2011/09/05 追記
- babie さんのコメントをいただいた configatron も使えそう。gem install configatron で入る。詳しくは以下。
リダイレクト時に params を引き継ぐ
以下のように、action の次にハッシュで繋げればよい
redirect_to :action => "user",:user => params[:user]
select_tag で選択時にsubmit したい場合
select_tag の引数として、 :onchange => 'submit();' を追加する。
<%= select_tag "user", options_from_collection_for_select(@all_user, "name", "name"),:onchange => 'submit();' %>
Rails3でJqueryを使う設定
Gemfile に以下を追記
gem 'jquery-rails', '>= 0.2.6'
コンソールから
$ bundle install $ rails g jquery:install
prototype.js 等が削除されてjquery が追加される
Rails3で rspec を使う設定
Gemfile に
gem 'rspec-rails', '>= 2.0.0'
コンソールで
$ bundle install $ rails g rspec:install
プロキシでエラーになったり 入ってなかったら root で gem install rspec-rails やってから再度挑戦。
カラムに属性を追加
マイグレーションでカラム追加用を作る
$ ruby script/generate migration AddPhoneToUsers phone:string $ rake db:migrate
タイムゾーンを日本に設定する
config/application.rb に以下を追加する。
config.time_zone = 'Tokyo' config.active_record.default_timezone = :local
- production 環境で行う場合は、キャッシュについても気をつけること。production.rb でキャッシュが有効になっているので、development 環境と動作が異なる場合がある。その場合はキャッシュをOFFしなければならない。(これでハマった・・・)
ユーザ認証機能を追加 Deviseを使う
DeviseのUserモデルにカラムを追加する
- 単に任意のカラムを migrate で追加するだけではアクセスできない
- Userクラスの attr_accessible に追加してあげる必要がある。
Passenger を使う場合の注意
- rails s の development 環境で動いたからといって安心してはいけない。
- production 環境で動かなくなったら以下を怪しむ
- passenger を使った production 環境で動かなくなったらRails.root 環境のファイルのパーミッションを疑う。すべて root ではなく任意のユーザ権限にすること。
そんな場合の不具合の症状
- sqlite のDBファイルへの書き込みアクセスができなくなる
Rails環境でバッチファイルを動かす
Railsアプリの ActiveRecordにバッチ処理で定期的にデータを入れたい場合に使える。
- バッチ処理を任意のクラスのクラスメソッドにして model 配下に置く
- rails の runner で実行する
$ /usr/local/bin/ruby script/rails runner MakeIndex.main
本番環境で実行したい場合は -e production をつける
$ /usr/local/bin/ruby script/rails runner MakeIndex.main -e production
定期実行したい場合は cron や jenkins などに上記コマンドを登録する