本番環境でテーブルがないと怒られた

Railsには、テスト用・開発用・本番用の3つ環境が用意されています。
詳しくはレシピ177に載っています。

Railsレシピブック 183の技

Railsレシピブック 183の技

各環境の切り替え

実行モード 説明
RAILS_ENV=production 本番用
RAILS_ENV=development 開発用
RAILS_ENV=test テスト用

各環境を呼び出すには、表のようなオプションを付けることでできます。
例えば、本番環境でサーバを動かすには

env RAILS_ENV="production" mongrel_rails start

のようにします。

テーブルがないエラー

上のように本番環境で起動させて、アプリを見たところ
以下のようなエラーが表示されました。

We're sorry, but something went wrong.
We've been notified about this issue and we'll take a look at it shortly.

エラーの通り"/log/production.log"を見てみると、以下のような内容が

ActiveRecord::StatementInvalid (Could not find table 'tablenames'):
...
...

どうもtablenamesテーブルが見つからないとのこと。
本番用にもマイグレーションする必要があるようです。
そこで以下のようにオプションを付けて実行。

rake RAILS_ENV=production db:migrate

無事表示されるようになりました。
この方法が正しいのかわかりませんが。


イマイチ開発から本番へのやり方が理解できていない。

3桁区切りの数字からカンマ(,)を取り除く

数字の表示で、よく3桁ごと(123,456,789)に区切って表示します。
Web上のテキストでも、こういう表現があるので
これを処理をする際に、カンマを取り除きたいと思ったのですが
標準のメソッドにはなさそうだったので考えてみました。

"123,456,789".gsub(/(\d{0,3}),(\d{3})/, '\1\2')
#=>"123456789"

何か荒がありそうですが、どうなんでしょうか。


ちなみに、平の数字から3桁ごとに区切る方法はこちらで紹介されていました。

数字に「12,345,678」と3桁区切りでカンマを入れたいときの話
http://app.blog.livedoor.jp/takaaki_bb/tb.cgi/51133994

Hpricotでタグ名を書き換える

Hpricotとは、rubyのhtmlパーサです。
これを使って、タグ名を書き換える時にわかったことをメモします。

タグ名を書き換える

例えば、html内のすべてthタグをtdタグに書き換えます。

require 'rubygems'
require 'hpricot'
require 'open-uri'

doc = Hpricot(open'http://example.co.jp/')

(doc/:th).each do |tag|
  #puts tag.name #=>'th'
  tag.name = 'td'
end

puts doc

「.name」でタグ自体の名前を得ることができます。
チュートリアルには、idやclassの検索方法は書いてあったのですが
これが分からず手こずってしまいました。


追記(12/16):.nameでタグを書き換えられると書きましたが、これだと開くタグはできますが閉じるタグが書き換えられないことに気付きました。
そこで、オフィシャルのチュートリアルhttp://code.whytheluckystiff.net/hpricot/wiki/HpricotAltering)にあった
swapメソッドを使って強引に書き換えてみることにしました。

require 'rubygems'
require 'hpricot'
require 'open-uri'

doc = Hpricot(open'http://example.co.jp/')

(doc/:th).each do |tag|
  tag.swap("<td>" + td.inner_text + "</td>")
end

puts doc

要素の中身のテキストだけを得る

あとチュートリアルで役立ったこともメモしておきます。


例えば下のようなhtmlを検索する場合

<th><b>ホゲ</b></th>

inner_htmlだと

(doc/:th).inner_html
#=> "<b>ホゲ</b>"

となりますが、inner_textを使うと

(doc/:th).inner_text
#=> "ホゲ"

と中身のテキストだけを得ることができます。


よって

<th><b>ホゲ</b>または<b>hoge</b></th>

だと

(doc/:th).inner_text
#=> "ホゲまたはhoge"

となります。

Hpricotについて

オフィシャルページ

Hpricot A Fast, Enjoyable HTML Parser for Ruby
http://code.whytheluckystiff.net/hpricot/

Railsでのタイムゾーンの指定について

Webアプリで扱いの難しい時刻表示についてです。
以前は結構めんどうくさかった気がするのですが
Rails2.1からconfig/environment.rbで簡単に指定ができるようになったそうです。

よりシンプルに日付と時刻の表示書式を整えるには...CommentsAdd Star
http://d.hatena.ne.jp/zariganitosh/20080809/1218241507

Rails2.1 new feature
http://blogs.sun.com/cinnabar/entry/rails2_1_new_feature

標準では

config.time_zone = 'UTC'

のようになっています。
ここを

config.time_zone = 'Tokyo'

のように変えることで、ローカルタイムゾーンで表示してくれます。


ちなみにローカルタイムゾーンを調べるには、以下のコマンドを使います。

rake time:zones:local
* UTC +09:00 *
Osaka
Sapporo
Seoul
Tokyo
Yakutsk

タイムゾーン
http://d.hatena.ne.jp/w650/20080731/1217477741

firefoxのアドオンの設定が起動ごとにリセットされてしまう

firefox3.0.4を起動または再起動すると、すべてのアドオンの設定が初期状態にもどってしまう現象に。
他のPCのfirefoxは、正常なのでプロファイルあたりがあやしそう。
セーフモードで確認しても、そんな感じがします。


あと起動するたびに「Firefoxの更新」のページが表示されるという現象も。

http://mozilla.jp/firefox/3.0.4/whatsnew/


やはりプロファイルを作りなおすべきなのか。

acts_as_taggable_on_steroidsの導入

Railsレシピブック 183の技

Railsレシピブック 183の技

acts_as_taggable_on_steroidsとは、Railsタグ機能を実現するプラグインです。
Railsレシピ本では、レシピ154にあります。


こちらはacts_as_taggable_on_steroidsのreadmeファイルです。

http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids/README

ここの通りすれば、使えるようになりました。


日本語だとここを参考にしました。

acts_as_taggable_on_steroidsの使い方まとめ
http://brass.to/blog/acts_as_taggable_on_steroids.html

フォームでの使い方

どうやらacts_as_taggableはtag_listメソッドが肝のようです。
これを使うことでtagテーブルへのタグの追加・取得が簡単に行えます。

new.html.erb
  <p>
    <%= f.label :tag_list %><br />
    <%= f.text_field :tag_list %>
  </p>

新規入力フォームの例です。
デフォルトでは、区切り文字はカンマ(,)です。
あとは普通に他の要素といっしょにコントローラで.saveすれば
tagテーブルにタグが1つずつ格納されました。

show.html.erb
<p>
	<b>Tag list:</b>
	<%=h @shelf.tag_list %>
</p>

表示ビューも似た感じです。
本当に簡単にタグが扱えました。


これを使うとタグクラウドなんかも実現できるようです。
使ったらまた紹介してみたいと思います。