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
2011/09/05 追記

リダイレクト時に 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 配下に置く
    • 例えば、MakeIndexというクラスの main クラスメソッドにバッチ処理を定義する
    • その中では普通に Rails アプリの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 などに上記コマンドを登録する

全角文字や数字を半角に変換する

Railsという訳ではないけど、検索エンジンを使うときとかに知っておくと便利。

require 'jcode'

keyword = '任意の文字列'
keyword = keyword.tr('0-9','0-9')
keyword = keyword.tr('A-Z','A-Z')
keyword = keyword.tr('a-z','a-z')