2011年6月23日木曜日

[Rails3] Gem ファイルリストを表示する

実行環境:
Rails 3.0.7

Gem ファイルリストを表示するコマンドのまとめ

しばらく使ってないと忘れてしまうのでメモ。

ローカルにインストールした Gem ファイルのリスト
ローカルにインストールした Gem ファイルのリスト
> gem list > gem list --local

リモートにある Gem ファイルのリストを取得する場合は --remote オプションをつける。
リモートにある、指定した名前から始まる Gem ファイルのリスト
●最新バージョンのみ表示
> gem list --remote gemfile_name
●すべてのバージョンを表示
> gem list --remote --all gemfile_name

指定した名前を含む Gem ファイルのリストを表示する場合
リモートにある、指定した名前を含む Gem ファイルのリスト
●最新バージョンのみ表示
> gem search --remote gemfile_name
●すべてのバージョンを表示
> gem search --remote --all gemfile_name

2011年6月20日月曜日

[Rails3] form_for と form_tag、text_field と text_field_tag の違い

実行環境:
Rails 3.0.7

ftext_field と text_field_tag の使い分けについて


Scaffold を作った時に自動的にできてくる View(_form.html.erb)を見ると

<%= form_for(@hoge) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>
ってな感じで f.text_field を使っています。

特定のモデルに結びついたフォームならこれでいいんですが、そうでない場合は form_for ではなく form_tag を使う、ってとこまでは理解していたんですが、form_tag の中の部品については text_field_tag を使う?でも text_field タグも使えちゃうみたいよ、どうすんだ??と漠然と疑問だったので調べてみました。

その結果は

まぁ、その通りでございますね (^^;;; やっぱり form_for の時は text_field グループを使う、form_tag の時は text_field_tag グループを使うってことで基本的にはいいようです。

しか〜し、これでは再確認しただけで当初の疑問は解決してまへん。もうちょっとつっこんで調べてみると、どうやら params への値の渡り方にポイントがあるようです。

結論としては

  • text_field グループ
    考え方:モデルを対象として、モデルの値を受け渡すためのフォーム部品
    振舞い:params 変数に二次元のハッシュとして値を渡す(一次元目のキーがモデル名)
  • text_field_tag グループ
    考え方:モデルには関連づけず、値のみを単純に渡すフォーム部品
    振舞い:params 変数に一次元のハッシュとして値を渡す
ということになります。

 

まとめるとそういうことなんですが、一応それぞれの場合を整理してみます。

form_forの中でform_tagの中で
text_fieldグループを①(標準的)②(特殊?)
text_field_tagグループを④(特殊?)③(標準的)

① text_field グループを form_for 内で使う(標準的)
Scaffold として作られる以下のようなフォームの場合、
<%= form_for(@hoge) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>
受け側で受け取るフォームの値は params[:hoge][:name] となります。 通常、モデルの作成や更新に使う場合
create アクション
@hoge = Hoge.new(params[:hoge])
update アクション
@hoge = Hoge.find(params[:id]) @hoge.update_attributes(params[:hoge])
といった具合で便利にできるので params の中身をことさらに気にする必要はないんですね。

② text_field グループを form_tag 内で使う場合(特殊ケース)
form_tag の中で text_field を使うときは少しパラメータの与え方が違って
form_tag の中で text_field
<%= form_tag url, options do %> <%= text_field :hoge, :name, :value => 'default_name' %> <%= submit_tag %> <% end %>
という感じになります。form_tag の中で text_field という形で使うと1番目と2番目のパラメータが名前として使われ、params[:hoge][:name] に値が渡されます。 HTML としてはこんな感じで展開されます。
展開された HTML
<input type="text" id="hoge_name" name="hoge[name]" value="default_name" />
params にハッシュで構造化した値を渡したいときは便利かもしれません。どんな用途があるかパッと思いつきませんが。 ハッシュにしたくないよってときは強引ですが
form_tag の中で text_field
<%= form_tag url, options do %> <%= text_field nil, nil, :id => name, :name => name, :value => 'default_name' %> <% end %>
とすれば
展開された HTML
<input type="text" id="name" name="name" value="default_name" />
と展開されますが、それならおとなしく text_field_tag 使えばって話です (^^;

③ text_field_tag グループを form_tag 内で使う(標準的)
form_tag の中で text_field_tag
<%= form_tag url, options do %> <%= text_field_tag :name, :value => 'default_name' %> <% end %>
とすると params[:name] に値が渡ります。

④ text_field グループを form_for 内で使う(特殊だけど使い道ありそう)
まず、以下のような書き方はできません。
form_for の中で text_field_tag
<%= form_for(@hoge) do |f| %> <%= f.text_field_tag :extra_text %> <% end %>
form_for の中でも form_tag の中でも使い方や挙動は同じです。
form_for の中で text_field_tag
<%= form_for(@hoge) do |f| %> <%= text_field_tag :name, :value => 'default_name' %> <% end %>
とするとやはり params[:name] に値が渡ります。注意すべきは params[:hoge][:name] のように params[:hoge] 配下に入らないということです。
form_for の中で text_field_tag
<%= form_for(@hoge) do |f| %> <%= text_field_tag :extra_text %> <%= f.text_field :name %> <%= f.submit %> <% end %>
という書いてやると、Hoge モデルに対応したパラメータ params[:hoge][:name] と、モデルとは関係ない params[:extra_text] を同時に渡せることになります。 場合によっては便利に使える気がします!(たぶん)

2011年6月16日木曜日

[Rails3] FasterCSVを使う(その3)

実行環境:
Rails 3.0.7
FasterCSV 1.5.4

FasterCSVを使う(その3):CSV出力編

CSV形式のテキストを出力するわけですが、出力のやり方は2通りあります。1つは文字列として取得する方法、もう1つはCSVファイルとしてローカルに(Railsアプリが動いているサーバ上に)書き出す方法です。
  • CSV形式の文字列を取得
  • CSVファイルに書き出す

CSV形式の文字列として取得する
使い方は簡単で、二次元配列を作ってあげるとCSV形式に組み立ててくれる、といった感じです。
csv_string = FasterCSV.generate do |csv|
  csv << ['1', 'Edward', 'steel']
  csv << ['2', 'Roy', 'flame']
  csv << ['3', 'Alex', 'iron-armed']
end
直接CSVファイルに書き出す
ファイルに書き出す場合も似たような書き方で、ファイル名を指定してファイルに書き出します。
FasterCSV.open('output.csv', 'w') do |csv|
  csv << ['1', 'Edward', 'steel']
  csv << ['2', 'Roy', 'flame']
  csv << ['3', 'Alex', 'iron-armed']
end
出力のオプション
デフォルトの設定ではカンマ区切りのCSVが出力されますが、区切り文字をタブに変更したり、といったことができます。
タブ区切り
csv_string = FasterCSV.generate({:col_sep => "¥t"}) do |csv| csv << ['1', 'Edward', 'steel'] end # csv_string: 1(tab)Edward(tab)steel
レコード区切りも変更
csv_string = FasterCSV.generate({:col_sep => ":", :row_sep => "|"}) do |csv| csv << ['1', 'Edward', 'steel'] csv << ['2', 'Roy', 'flame'] end # csv_string: 1:Edward:steel|2:Roy:flame
各フィールドを引用符で囲む場合
ダブルクォーテーションマーク(")で囲む
csv_string = FasterCSV.generate({:quote_char => '"', :force_quotes => true}) do |csv| csv << ['1', 'Edward', 'steel'] end # csv_string: "1","Edward","steel"
囲む文字 :quote_char はデフォルトで「'」にセットされていて :force_quotes => true を指定すると初めて表示されます。:quote_char を空文字列にすると1文字にしろとおこられるので、囲みたくない場合は :quote_char を消すのではなく :force_quotes => false (デフォルト値) にするということですね。

ドキュメントにはオプションが CSV 読み込みと共通って書いてあるけど、使えるオプションはこれくらいかと。

[Rails3] FasterCSVを使う(その2)

実行環境:
Rails 3.0.7
FasterCSV 1.5.4

FasterCSVを使う(その2):読み込み編

[Rails3] FasterCSVを使う(その1)

実行環境:
Rails 3.0.7
ruby 1.8.7
FasterCSV 1.5.4

FasterCSVを使う(その1):インストール編


FasterCSV は CSV 形式ファイルの読み書きができる gem です。
標準でも CSV の読み書きができる CSV クラスがありますが、FasterCSV の方が速いらしいです。(でも比較してないので、そこは気分で ^^;)

ちなみに ruby 1.9.x になって FasterCSV が標準の CSV クラスとして採用されているので FasterCSV をわざわざインストールする必要はありません。普通に require 'csv' して FasterCSV クラスの代わりに CSV クラスを使えばOKです。

FasterCSV のインストール
Bundler を使えば簡単にインストールできます。

①アプリケーションのルートディレクトリのGemfileに
./Gemfile
gem 'fastercsv'
を追記

②Bundlerでインストール
> bundle install

※Bundlerでのインストールについては、[Rails3] Bundlerを使ってGemファイルをインストールも見てね。

③requireも忘れずに
アプリケーション全体で頻繁に使うなら、config/application.rb に書いていつでも使えるようにします。
config/application.rb
class Application < Rails::Application # ... require 'fastercsv' end

特定の controller や特定の action でしか使わないよ、ということなら個別の controller の中に書いてもいいです。
app/controller/user_controller.rb
class UserController < ApplicationController require 'fastercsv' # controller の中に書く場合 def index require 'fastercsv' # action の中に書く場合 # ... end end
もしくは
app/controller/user_controller.rb
class UserController < ApplicationController end

これで準備OKです。

2011年6月14日火曜日

[Rails3] デフォルト以外のViewのテンプレートを使う

実行環境:
Rails 3.0.4
デフォルトでは action と同名の view のテンプレートが使われる。
敢えて別のテンプレートを使用する場合のやり方。

class UsersController < ApplicationController
デフォルトのテンプレートを使う場合
def index respond_to do |format| format.html # アクションと同名の index.html.erb を使用 end end
他のアクションのテンプレートを使う場合
def show respond_to do |format| format.html { render :action => :index } # 指定したアクションのview テンプレートを使用 end end
テンプレートを直接指定する場合
def edit respond_to do |format| # view テンプレートを app/views/ 以下の相対パスで指定(拡張子は省略する) format.html { render :template => 'user/index' } end end end

2011年6月8日水曜日

[Rails3] ActiveReocrdで外部DBを使う

実行環境:
Rails 3.0.4

Railsでは基本的に1つのDBを使用するように設計されています。デフォルトで使用するDBは config/database.yml 内で、実行モード(Rails_Env:development/test/production)別にDBが指定されていますが、これらのデフォルトのDB以外のDBに接続するやり方です。

用途としては例えば、他のシステムで使用しているユーザテーブルを参照する(いわゆるレガシーDBというやつですね)、アクセスログデータを別のサーバ上に保管する、などといった場合があるでしょう。

ここで想定する外部DB/テーブルの条件

  • 使用しているデータベースのアダプタがある
    MySQL, PostgreSQL, SQLite3, Oracle, DB2, SQL Server, ...

  • 使用するテーブルに、整数型の単独の主キーが存在する
  • Railsアプリケーションのサーバからアクセスが可能
    別サーバ上のSQLiteなどのSQLサーバになっていないDBは対象外
    (そんな場合はこんな方法も ⇒ 新規RailsアプリからレガシーなDBを参照する方法 - 今日とは違う明日


モデルを外部DBと結び付ける


1. モデル定義で外部DB接続を指定
普通のモデル定義の中でestablish_connectionというメソッドを呼び出します。connectionはシングルトンで動作するのでestablish_connectionが呼び出されると、デフォルトのDB接続の代わりに指定されたDB接続が使われます。
app/models/users.rb
class User < ActiveRecord::Base establish_connection( :adapter => "mysql", :host => "dbserver", :database => "dbname", :username => "user", :password => "opensesame" ) # ... end

テーブル名や主キー名を指定する
外部DBのテーブル名や主キー名がRailsの規約に沿っている場合は上記でOKですが、他システムのDBを参照する場合などテーブル名や主キー名が規約通りでない場合、使用するテーブル名や主キーのカラム名を指定してあげる必要があります
app/models/user.rb
class User < ActiveRecord::Base establish_connection( # ... ) set_table_name "USER_TBL" set_primary_key "UID" # ... end
こうするとデフォルトのDBのテーブルと同じように扱えます。
@user = User.find(1)

2. DB接続の設定をconfig/database.ymlに設定する
モデルの中にDB接続設定を直接記載するのではなくアプリケーションの設定として記載する方がスマートです。config/database.ymlの中にデフォルトのDB接続情報に加えて外部DBの接続情報を追加します。
config/database.yml
development: # ... test: # ... production: # ... legacy_db: adapter: mysql encoding: utf8 database: dbname username: user password: opensesame host: hostname

app/models/users.rb
class User < ActiveRecord::Base establish_connection(:legacy_db) # ... end

3. 外部DB接続の定義ファイルを独立させる
例えばconfig/legacy_database.ymlという別ファイルにDB接続の設定を保存するとする。
config/legacy_database.yml
adapter: mysql encoding: utf8 database: dbname username: user password: opensesame host: hostname

app/model/user.rb
class User < ActiveRecord::Base config_legacy = YAML.load_file(Rails.root.join('config/legacy_database.yml')).symbolize_keys establish_connection(config_legacy) # ... end

同じ外部DBに接続するモデルが複数ある場合
各モデルに上記の方法(1, 2, 3のいずれか)の通りに書けばアクセスはできるようになります。が、コネクションプーリングを有効に活用するという観点からは、外部DB接続する親となるモデルを作り、親モデルを継承させて各モデルを作る方がよいようです。

以下のようにすると、User1とUser2は接続先のDBは同じでも別々の接続を使います。(コネクションプールが2つ使われてしまいます。)
app/models/user1.rb
class User1 < ActiveRecord::Base establish_connection(:legacy_db) end
app/models/user2.rb
class User2 < ActiveRecord::Base establish_connection(:legacy_db) end
以下のように継承を使うとUser1とUser2は同じコネクションを使ってくれます。
app/models/legacy_base.rb
class LegacyBase < ActiveRecord::Base establish_connection(:legacy_db) end
app/models/user1.rb
class User1 < LegacyBase end
app/models/user2.rb
class User2 < LegacyBase end

[Rails3] Viewでコントローラ名/アクション名を取得する

Viewの中でコントローラ名やアクション名を参照するには、Controllerクラスのインスタンスであるcontrollerを使って取得できます。
#{RAILS.ROOT}/app/views/xxxx.html.erb
  <%= controller.controller_name %>  # コントローラ名
  <%= controller.action_name %>  # アクション名

ただしこの方法では namespace を取得できません。
つまり UsersController も Admin::UsersController も、controller_name は同じく users を返すってこと。残念な人には残念かも…


ちなみに Controller の中であれば、メソッド名だけで呼べます。
#{RAILS.ROOT}/app/controllers/xxxx_controller.rb
  ctrlname = controller_name  # コントローラ名
  actname = action_name  # アクション名

2011年6月3日金曜日

[Rails3] Spreadsheet でセルの結合を扱いたい!

実行環境:
Rails 3.0.7
Spreadsheet 0.6.5.4

Spreadsheet でセルの結合を扱いたい!

と思って色々調べてみたのですが、現状では残念ながらできないみたいです。

SpreadsheetでExcelファイルを開いてフォーマットクラス(Spreadsheet::Format)やらの中身を見てみましたが、セル結合の情報はどうも取得されていないようで…

RubyForge: spreadsheet: helpに「セルの結合はきちんとインプリメントできてないよ。0.7 を待っててね」との書きこみもあったので、いまのところは無理そうということですね。

2011年6月1日水曜日

[Rails3] Spreadsheetを使う(その2)

実行環境:
Rails 3.0.7
Spreadsheet 0.6.5.4

Spreadsheetを使う(その2):Excelファイルを読む

今のバージョンでは、読み込めるExcelファイルはExcel2003形式(.xls)だけのようで、Excel2007形式(.xlsx)は読み込めません。

Excelファイルを開く
book = Spreadsheet.open('public/test.xls', 'rb')
ファイル名の起点はアプリケーションのルートディレクトリ(#{Rails.app})になります。したがってファイル名はルートディレクトリからの相対パスで指定します。

ワークシートを開く
ワークシートは0から始まる番号で指定するか、ワークシート名で指定します。
番号開く(引数がInteger)
sheet = book.worksheet(0)
名前で開く(引数がString)
sheet = book.worksheet("sheet1")

存在しないシートを指定すると nil が返ります。
if book.worksheets(500).nil? then
  ...
end

ワークブックに含まれるワークシートすべてにアクセスするには worksheetsメソッドを使います
book.worksheets.each do |sheet|
  ...
end

データが空っぽのワークシートをスキップするなら…
book.worksheets.select{|s| s.row_count>0 }.each do |sheet| ... end


シート内の各セルのデータを取得する
特定のセルの値にアクセスする方法。行番号(i)、列番号(j)はいずれも0から始まります。つまり"A1"セルの座標(i,j)は(0,0)、"B1"セルなら(1,0)です。
セルの座標を直接指定する
cell = sheet[i,j] cell = sheet.cell(i,j)
行クラスのインスタンスを取得し、そのj番目を指定
row = sheet.row(i) cell = row[j]
列クラスのインスタンスを取得し、そのi番目を指定
column = sheet.column(j) cell = column.to_a[i] # Columnクラスには[]が定義されていない

eachを使って各セルの値を取得する
sheet.each do |row|
  row.each do |cell|
    value = cell
  end
end
cellにはセルの内容によって
・Stringクラス
・Floatクラス(整数の場合もfloatになる)
・Dateクラス
などのインスタンスが入ります。数字や日付の場合でもExcel上でセルの値の頭に「'」をつけておくStringとして取得します。表示形式を文字列にしても変わりません。
セルが空白の場合は Nil が返ります。
数式の場合はSpreadsheet::Formulaクラスのインスタンスが入ります。cell.valueで最後に計算された値が取得できます。

各セルの値を取得する(数式の入ったセルにも対応)
sheet.each do |row|
  row.each do |cell|
    value = cell.instance_of?(Spreadsheet::Formula) ? cell.value : cell
  end
end

sheet.each、row.each の走査範囲
シート内のデータを走査する場合に、値の入っていない行を65535行も走査するとしたら無駄ですね。でも、上記の sheet.each や row.each ではちゃんとデータが入っている範囲だけを走査してくれます。たとえば最初の行がどのセルにも値が入っていない空行であれば2行目から読みます。列方向も同様です。

ということは sheet.each で現れる最初の行が1行目とは限らない、ということになります。
行/列の番号を気にする場合はカウンター変数を使った方がいいでしょう。Worksheet.dimensions メソッドでシート内のデータが入っているセル範囲が取得できます。
first_used_row, first_unused_row, first_used_col, first_unused_col = sheet.dimensions

(first_used_row...first_unused_row).each do |i|
  row = sheet.row(i)
  (first_used_col...first_unused_col).each do |j|
    cell = row[j]
  end
end
ちなみに、データが入っていない行/列であっても書式が設定されていると有効範囲として認識されます。

[Rails3] Bundlerを使ってGemファイルをインストール

実行環境:
Rails 3.0.7
Bundler 1.0.12
Rails3アプリケーションで必要な gem ファイルをインストールする場合、bundler を利用するととても便利です。

手順は簡単で、アプリケーションのルートディレクトリ(Rails.root)内にある Gemfile に必要な gem ファイルを記載し、bundle コマンドを実行すると Gemfile の記載に従ってインストールしてくれます。

Gemfileにインストールするgemファイルの情報を記載

実行モードを問わずインストールする場合はこんな感じで書く
#{Rails.root}/Gemfile
gem 'ruby-debug' gem 'ruby-debug19', :require => 'ruby-debug' gem 'jquery-rails', '>= 0.2.6'

特定の実行モードでインストールするときはこんな感じで書く
#{Rails.root}/Gemfile
group :development, :test do gem 'rspec' gem 'rspec-rails' end


bundle コマンドを実行してインストール

まずはカレントディレクトリをアプリケーションのルートに変更しておきます。bundle コマンドはカレントディレクトリの Gemfile を読み込むからです。

次にインストールする前に gem のインストール先についてぜひ考えておきましょう。つまりサーバ全体にインストールするか、それともアプリケーション内にインストールするかということです。


単純に
bundle install
とうつと、カレントディレクトリにあるGemfileの内容を元に ruby/gems 配下にインストールします。ですのでサーバ内の全環境にインストールします。

インストール先の情報を指定して
bundle install --path vendor/bundle
とすると、#{Rails.root}/vendor/bundle 配下にインストールされ、そのアプリケーションの中だけにインストールされることになります。(インストール先は別にこの名前じゃなくてもよいみたいですが…)

1つのサーバ内で1つのアプリケーションしかないのであればどちらでも大差ないですが、複数のアプリケーションが、複数の Rails のバージョンで動いていると、様々なバージョンの gem が混在することになって気持ち悪いです。なので、というかメンテナンス性という点からも、アプリケーションの中にインストールした方がよいかと思われます。

ちなみに一度、インストール先を指定して bundle install コマンドを実行すると、Rails.root 配下に .bundle/config というファイルが作成されます。
.bundle/config
--- BUNDLE_PATH: vendor/bundle BUNDLE_DISABLE_SHARED_GEMS: "1"
インストール先を記憶してくれているので、次回以降は単に
bundle install
とするだけで同じディレクトリにインストールしてくれます。


bundle でインストールされた gem ファイル一覧

アプリケーションのルートディレクトリ(Rails.root)に移動して
bundle list
コマンドを実行すると、bundleでインストールされたgemリストが表示されます。

Gems included by the bundle:
  * abstract (1.0.0)
  * actionmailer (3.0.7)
  * actionpack (3.0.7)
  * activemodel (3.0.7)
  * activerecord (3.0.7)
  * activeresource (3.0.7)
  * activeresupport (3.0.7)
  * arel (2.0.9)
  * builder (2.1.2)
  * bundler (1.0.12)
  * erubis (2.6.6)
   (以下略)

[Rails3] Spreadsheetを使う(その1)

実行環境:
Rails 3.0.7
Spreadsheet 0.6.5.4

Spreadsheetを使う(その1):インストール編


Spreadsheet は Excel ファイルの読み書きができる gem です。
Excel2003形式(.xls)のファイルの読み書きができます。そして、ruby で書かれていて Windows じゃなくても使えるのがいいところ。Rails アプリケーションの中で Excel ファイルを読み書きする必要があり Spreadsheet を導入してみました。

Spreadsheet のインストール
Spreadsheet をインストールするのは Bundler を使えば簡単。

①アプリケーションのルートディレクトリのGemfileに
./Gemfile
gem 'spreadsheet'
を追記

②Bundlerでインストール
> bundle install

※Bundlerでのインストールについては、[Rails3] Bundlerを使ってGemファイルをインストールも見てね。

これで準備OKです。

[Rails3] rake db:fixtures:load FIXTURES=xxxxx が失敗する件

実行環境:Rails 3.0.7

rake db:fixtures:load FIXTURES=xxxxx が失敗してしまう


個別のテーブル(categories)についてfixtureデータのロードを行おうとして
rake db:fixtures:load FIXTURES=categories
としたところ、エラーが出て catego.yml も catego.csv も見付からないと怒られてしまった。ま、確かにそんな名前のファイルは用意してないんだけど…

試しに
rake db:fixtures:load FIXTURES=menus
をやってみると、m.yml、m.csv が見つからないと言われた…
どうやら FIXTURES で指定した名前の末尾4文字を削除して、そこに .yml か .csv をくっつけてファイルを探している模様。

拡張子をちゃんとつけてやればいいってことかなと思い
rake db:fixtures:load FIXTURES=categories.yml
としたら無事動きました!

ついでに当然ながら
rake db:fixtures:load FIXTURES=categories.xxx
としても普通に動いちゃいました…


拡張子までちゃんとつけなきゃだけど、拡張子を差し替えて探すのかぁ。
機械的に4文字消しちゃうってどうなのかなぁ? 拡張子だって3文字とは限らないし。

※Rails2では拡張子なしでloadできたけど、個人的にはその動作の方がよいような気が…

ま、とにかく拡張子までつけるってことで!

[Rails3] HTMLエスケープがデフォルトになった

Rails2 では view で h ヘルパーを使うことでHTMLエスケープ(例えば、"<" ⇒ "&lt;" ということ)されるが、Rails3 ではHTMLエスケープがデフォルトになっている。つまり単純に <%= %> とするだけでHTMLエスケープされた状態で出力される。 Rails3では
HTMLエスケープあり
<%= ... %>
HTMLエスケープなし
<%= raw ... %>


Rails2では
HTMLエスケープあり
<%=h ... %>
HTMLエスケープなし
<%= ... %>

実行環境:Rails 3.0.7

[Rails3] ルートディレクトリの参照

Railsアプリケーションのルートディレクトリ参照
Rails3のアプリケーション内でアプリケーションのルートディレクトリのパスを参照する場合、Rails.root というクラスメソッドで参照できます。
※Rails2では RAILS_ROOT という定数で参照する。


Railsアプリケーションの実行モード参照
ちなみにRails3のアプリケーション内でアプリケーションの実行モード ( development / test / production ) については Rails.env というクラスメソッドで参照できます。
※Rails2では RAILS_ENV という定数で参照する。

実行環境:Rails 3.0.4