カテゴリ: rails の記事 [リスト]
ruby on railsに関するメモ。- donrails(126) / Railsで構築したblog日記ドキュメント管理システム。Diary/Document on Railsの略
railsが1.2でUbuntuが7.10だった時代に作っていたdb2をつかったアプリをいい加減rails2.2に対応させたので忘れる前にメモ.
| 旧 | 新 | |
| Ubuntu | 7.10 | 8.04 |
| rails | 1.2.6 | 2.2.2 |
| DB2 | 9.5 | 9.5(同じ) |
| gem | 0.84(rubygems.debのやつ) | 1.3.1 |
| ibm_db | 0.94 | 1.0.0 |
そしてActiveScaffoldも使っている.
- とりあえずまずはubuntu8.04をいれる.いれたらdb2exeをいれる.
- ubuntuのrubygemsでgemをがんがん入れていってもいいのだが,gemは古いのでまずupdate.gemをupdateするとrubygems.debでいれてたものは台無しになるので,まずはgemをupdateする.
sudo gem update --system sudo apt-get remove rubygems
- できたらgemでibm_dbとrailsをいれる.
sudo -s . /home/db2inst1/sqllib/db2profile export IBM_DB_DIR=/home/db2inst1/sqllib export IBM_DB_LIB=/home/db2inst1/sqllib/lib32 gem install ibm_db gem install rails -y gem install rake -y
- active_scaffoldをgitからとってくる.
rails2.2では1.2時代に動いてたactive_scaffoldはもう動かない.http://activescaffold.com/ をみるとやりかたが書いてある.
git clone git://github.com/activescaffold/active_scaffold.git vendor/plugins/active_scaffold && rm -rf vendor/plugins/active_scaffold/.git
- config/ 以下をいじる
config/environment.rbに config.action_controller.sessionを追加.
config.action_controller.session = { :session_key => "hogecode", :secret => "
abcdefghijklmnopqrstuvwxyz...." }
rake db:migrateかますと,config/environments/development.rbがおかしいことを
指摘してくれる
$ rake db:migrate --trace ..... ** Invoke db:migrate (first_time) ** Invoke environment (first_time) ** Execute environment rake aborted! undefined method `cache_template_extensions=' for ActionView::Base:Class /usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:530:in `send'
http://d.hatena.ne.jp/zariganitosh/20080621/1214110380 にある
config/environments/development.rbの「config.action_view.cache_template_extensions= false」オプションは推奨されなくなり、何の影響も与えないらしい...。削除してくださいと警告されているので、削除してしまった。(警告なので削除しなくてもサーバーは起動する。)
というかんじ.
- DB2のcreatedbをする.
PAGESIZEが小さいとDB2におこられることがある.
== Initial: migrating ========================================================
-- create_table("contacts", {:force=>true})
-> 0.1195s
-- create_table("inbounds", {:force=>true})
rake aborted!
An error has occurred, this and all later migrations canceled:
ActiveRecord::StatementInvalid: [IBM][CLI Driver][DB2/LINUX] SQL0286N A default table space could not be found with a page size of at least "8192" that authorization ID "DB2INST1" is authorized to use.
しょうがないのでdbをつくりなおす.(db2inst1 ユーザでおこなう)
$ db2 drop db xdmsdev $ db2 create database xdmsdev using codeset utf-8 territory us PAGESIZE 32 K
できたら
rake db:migrate
- rake testで試す.
が,rake test:unitsはibm_db 1.0.0では対応してないようだ.
rake aborted! Task not supported by 'ibm_db'
とりあえずこれでokだった.donrailsの場合はCSRFを自前で対応していたり,いろいろ凝ったことをしているので大変だったが,こっちはあんがいとうまくいった.
Seriously, Just Buy a Fucking Mac
Just do it. Stop making excuses. I was a Windows user for about ten years but mainly because I didn’t know any better. I now work full time on a mac, both at home and at work, and there’s not a thing you could do to make me go back to Windows.
Windows simply won’t do a lot of things that you’ll want to do. Background jobs? Not a chance. Git? oh yeah, you can use msysgit but who the fuck wants to open up a separate program just to use git? Fuck off Windows. You’re slow and you suck.
Why get a mac? Rails runs faster. You can use the best text editor around, TextMate. You can install all those gems and plugins that all say: “This won’t work on Windows”.
Think getting a mac is too expensive? Get a low spec mac mini for $599. That’s what I started using and even though it’s low spec I never had a problem with it. You can use your USB keyboard, mouse and your monitor from your Windows machine. Still think it’s too much? Have a look on Amazon… Preowned Mac Mini for $350
- まあわからなくはないのだが,railsで開発するような人でもLinuxやBSD使うのはむずかしいのか? それなら金もかからんうえに,もっと自然に使えると思うのだが..
- TextMateもいいけど,日本語入力に難があるような..
rubypondのsemantic_form_builderはいいかんじそうなので使ってみよう.
donrailsがうごいてるdonrails.araki.netではruby1.8.5で動いているので問題ないのだが,ノートの上のsidではrubyが1.8.7にあがったようで,rails2.0.2+ruby1.8.7でtestを通らなくなった.
まずひとつ目はtruncate(/var/lib/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/text_helper.rb)を見てみる.
def truncate(text, length = 30, truncate_string = "...")
if text.nil? then return end
l = length - truncate_string.chars.length
(text.chars.length > length ? text.chars[0...l] + truncate_string : text).to_s
end
どうやらtext.chars.lengthというのを中で使っていて,ruby1.8.7ではtext.chars.lengthがつかえない.これはので,text.chars.to_a.lengthとすれば回避できた.1.8.7で,Enumerable::Enumerator を返すようになったのが問題なのかな.
irb(main):001:0> "hoge".chars.length
NoMethodError: undefined method `length' for #<enumerable::enumerator:0xb7be8c70>
from (irb):1
irb(main):002:0> "hoge".chars.to_a.length
=> 4
irb(main):003:0> "hoge".length
=> 4
というかんじ.はて.etchではどうかとおもったが,
irb(main):001:0> "hoge".chars.length
NoMethodError: undefined method `chars' for "hoge":String
from (irb):1
irb(main):002:0> "hoge".chars.to_a.length
NoMethodError: undefined method `chars' for "hoge":String
from (irb):2
from :0
irb(main):003:0> "hoge".length
=> 4
irb(main):004:0> RUBY_VERSION
=> "1.8.5"
あれれ.しかしどっちにしろ"hoge".lengthですむのになんでString.charsなってんだろ.国際化対応のせいなのかなあ..よーわからん.世にはこんなパッチを出している人もいるようで. http://www.ruby-mine.de/assets/2007/12/31/ruby-19-on-rails-fixes.diff
手元ではrails2.1.0 + ruby1.8.7でやる時期がきたのかもしれない.
しかしなかなかうまくいかなかった.まあ結局のところこんなかんじでうまくいった.
ということだった.http://techno.hippy.jp/rorwiki/?HowtoFunctionalTest
質問 2: ある@flashアイテムがセットされていたら、ビューに特定のセクションが表示されることをテストしたかったら、どうやって@flashオブジェクトをセットアップすればいい? request.session['flash']に値を設定してみたんだけど、うまくいかないみたいだった。
答え: リクエストはパラメータを4つ受け取って、最後がflashパラメータだ。 たとえば: get :index, nil, nil, { :what =&gt; "ever" }
BackgrounDRbが1.0.3になったら,そのためのpinngerが動かなくなっていたので修復した.
ようはBackgounDRbで呼びだすPinggerWokerが内部でActiveRecordをつかってとあるmodelを呼びだしているのだが,呼びだせなくなっていた.
ようするに,lazy_load: true としてやればいいというだけのことだった.
わかってしまえば何てことはないのだがな.
BackgrounDRb - Introduction BackgrounDRb
lazy_load option should be false if you want to pass ActiveRecord model objects around, However, this option is generally not encouraged to use, because if your model makes use of some other ActiveRecord plugin and plugin is not available during load, loading of model will fail. In new version of BackgrounDRb its generally discouraged to pass model objects around, since they are harder to serialize and deserialize.BackgrounDRb - Introduction BackgrounDRb
:lazy_load: true # load models eagerly
とある目的でPHPで構築されていたwebを徐々にrailsにかえていくというミッションをやっている.
- プランA: 現pageのphpファイルをRAILS_ROOT/public以下にcopyし,phpとfcgiを両方動作させる方法.この問題点はphpとfcgiの両方動作させることができるか未知数なところ
- プランB: 現pageのPHPはdynamicなpage生成につかわれているわけではないのでphpのレンダリング結果をどうにかして全部RAILS_ROOT/public以下に展開する.wgetかなんかすれば全部つくれるとは思うけど,ちょっとでかいかもしれない.
- プランC: 現pageとは別の11011で別途はしらせたまま11011にmod_proxyする.安定性が問題かも.
まあ個人的にはA,B,Cの順に綺麗な解だと思っているが,どの方法にも一長一短がある.結局いろいろやったところAの方法で.
けっきょく RAILS_ROOT/public/.htaccessをこんなかんじにした.
AddHandler fcgid-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI -Indexes
DirectoryIndex index.cgi index.html index.shtml index.php
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} \.php
RewriteRule ^(.*)$ $1 [QSA,L]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}/index.php -f
RewriteRule ^(.*)$ $1/index.php [QSA,L]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1 [QSA,L]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^(publications|admin/.*)/?$ dispatch.fcgi [QSA,L]
この最終行がちょっと気にいらないところで,けっきょくこう書かないとPHPとの共存ができないかなしいことに.
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
にしてしまうとなぜか[L]が効かず,PHPのほうまでこの行が有効になってしまうのでありました.
とりあえずこれ以上の深追いはしないことにした.
あくまでメインは仕事のためなんだが、仕事の実装がJRubyでは動かないままだったのだが、土曜にJRuby1.0.3もでたし、railsも2.0.1でたし、ってことでちゃんと動かしてみようと。が、結果から言うと、クリーンで単純なものならあっさり動き、自分がいじっているコードはそうじゃないので大変。というものであった。いっそsvnきりなおしてcleanなとこから書きなおしてやろうか。。というかんじである。
- ActiveScaffoldはtrunkにしないとrails2.0.1では動かない。rake testの段階で詰まるのでrake testしてりゃ気がつく。
- そういうときはsvn externalするのが常套なのだがすっかり忘れていた。
svn propedit svn:externals vender/plugins
するとeditorでactive_scaffold http://activescaffold.googlecode.com/svn/trunk
- database.ymlにsocket: でmysqlのsocketをかいてやらんと、rails2.0にしたせいかdefaultの位置がズレているようでだめだった。
まあともかくどうしてくれようか感ただようので、手でdrbあげていたところも、BackgrounDRbにしたいところだし。どうするかなあ。
とはいえ1/6と1/9とにconference締切が迫っているので本質的なところで時間が。
まあ実際のとこFileの時間をみているので気にしなくていいらしい。
T氏がasset_idほにゃららがウンヌンという話になったので、Y氏が
def rails_asset_id(source)
ENV["RAILS_ASSET_ID"] || File.mtime("#{RAILS_ROOT}/public/#{source}").to_i.to_s rescue
end
Fileの時間なのでcacheとかは問題ないんでは?消したければ
ENV["RAILS_ASSET_ID"]=""
ということでいいらしい。と、おしえてくれた。
(関係者様の都合と私の忘却力により一部改変)
残念なことに8/1時点(trunk)のActiveScaffoldはhas_many :throughでモデル化されたものについてeditすることができていない。7/21のメールではできるよー、って話なんだができてないのでまあそこのあたりは作るかなと。
そこで0.0.6からすでに対応している、とのたまっているstreamlinedをためしてみた。ためしたのは、すでにact_as_streamlinedになっている最近のやつ。http://www-128.ibm.com/developerworks/java/library/j-cb09056/にるDWの記事をみたり、してみたのだが、
- どうにもhas_many :throughの先をeditすることができない。
- たとえばAuthorsモデルをいじるには controller => 'author' にするのが前提で、Admin::authorをつくってディレクトリの下にとじこめようとしても、/author/edit...みたいなのをlink先として作ってしまう(いちおうauthorのところは別のに変えることもできる)のでどうも気にくわない。
- donrailsをはじめたころにはそんなもんなかった
- migrateは当初sqlite、sqlite3に未対応
- donrailsというか私はそれをつかっていた
という理由だったのだがすべて解決し、今やOracleでもMSSQLでもmigrateできてしまうのでこれを使うことにした。
最初からmigrateをつかっていればはまらなかったのだが、不幸にも私ははまるケースで、
rake db:migrate
をすると、なんと使っていたテーブル(とその内容)が消えてしまう現象が。
いろいろ疑ったり試したりした結果、production -> developmentにcopyしてdevelopmentでmigrateしたあとでdatabase.ymlをかきかえという方法で対応することにした。
$ mysqldump -t donrails_production > donrails-0712a.sql
$ vi database.yml
して、developmentにdonrails_production2を追加
$ mysqladmin create donrails_production2
で、db作成
$ rake db:migrate VERSION=1
テーブルがいろいろできる
$ mysql donrails_production2 < /tmp/donrails-0712a.sql
元のデータをかきもどし。
ここまででokなのだが今回はついでにtableを一部変更してversion2にしないといかんので
$ rake db:migrate VERSION=2
としてChangeHabtmToHmtを適用。
$ vi database.yml
prodcutionにdonrails_production2をみるように書きかえる。
メモ:mysqldumpによるバックアップ
- テーブルを作成させない形式でのバックアップ: mysqldump -t donrails_development
- 通常のバックアップ: mysqldump donrails_development
というわけで終了
事の顛末はdonrailsのgoogle groupsに書いたとおりなのだが、
- railsのcontrollerを通常時
- 例えば :controller/:action/:id にroutes.rbによって donrails.araki.net/archives/show/1 というURLはarchivesがcontroller, showがaction, 1がid
- このときのcontrollerはrails/app/controller/archives_controller.rb に展開される。
- cacheを消すためには
expire_page(:contoller => 'archives', :action => 'show')
- railsのcontrollerを入れ子にしているとき
- donrails.araki.net/admin/article/show/1 というURLはadmin/articleがcontroller, showがaction, 1がidとなる。
- 先ほどのcontrollerが作った/public/archives/show/1.htmlというcacheを消すためには :controllerの指定には '/'を先頭につけてやる必要があるようで結局
expire_page(:contoller => '/archives', :action => 'show')
というわけでpage-cache-testをぐるぐる回しながら結局3時間くらい費やしてしまった。
GW中に管理者向けのcontrollerを admin/もげもげ/:action という形に入れ子にして書きかえた。それで問題が生じていたようだ。
まあどういうことかといえば、
https://ほげほげ/admin/login/login_index
の解釈がlighttpdのfcgiの解釈では
Parameters: {"action"=>"login", "id"=>"login_index", "controller"=>"admin"}
となっていて、
webrickでは
Parameters: {"action"=>"login_index", "controller"=>"admin/login"}
となっている。後者のほうになってほしい。
というわけで
routes.rbにこんなのを追加したら問題はなおったようだ。
map.connect ':controller/:action',
:requirements => {
:controller => /admin\/\w+/
}
で、気になったDHHの発言。
Riding Rails: Rails 1.2: Release Candidate 2:
The next big release will be 2.0, so I wouldn’t expect that for another six months at the earliest. But thankfully the edge is very easy to use these days and much of the big-release developments premiere in plugins first. Masterleep, rel_1-2-0_RC2 is now available.