検索:
以降の記事を見る

This is ARAKI's daily notes.

実ノ商人ハ先モ立チ我モ立ツコトヲ思フナリ

管理/ トップ/
カテゴリ/ 日記(全部): 技術系: devel: postfix: donrails: rails: ruby: mono: food: road:

カテゴリ: rails の記事 [リスト]

ruby on railsに関するメモ。
  • donrails(126) / Railsで構築したblog日記ドキュメント管理システム。Diary/Document on Railsの略
#1 [ubuntu][db2][rails] DB2+railsアプリをUbuntu7.10から8.04(LTS)にportした

railsが1.2でUbuntuが7.10だった時代に作っていたdb2をつかったアプリをいい加減rails2.2に対応させたので忘れる前にメモ.

Ubuntu 7.108.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を自前で対応していたり,いろいろ凝ったことをしているので大変だったが,こっちはあんがいとうまくいった.


written by Ar- at Wed Dec 03 07:31:33 UTC 2008
#1 [debian][rails][macosx] railsの実装速度をあげる方法でMac買えという話があるのだがそんな気がしない件
Speeding Up Rails Development | Ruby on Rails というところでいろんな方法が紹介されているが,そのなかでMacかえという話.
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もいいけど,日本語入力に難があるような..
まあなんにせよmacも安くなってきたのはいいのか.
rubypondのsemantic_form_builderはいいかんじそうなので使ってみよう.

written by Ar- at Mon Nov 17 22:39:34 UTC 2008
#1 [ruby][donrails][rails][debian] rails2.0.2+ruby1.8.7でtestを通らなくなった.

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でやる時期がきたのかもしれない.


written by Ar- at Tue Jun 17 13:47:42 UTC 2008
#1 [donrails][rails] railsのtest時にflash[:what]を設定する
g15のためにadminとしてloginしなくても記事が書けるように新たにauthorコントローラをつくってみた. 作ったからにはtestも書いておかねばならんが,controllerの動作中でflash[:author_name]の値を使っているので,これをtestのrequestにも追加しなければならない.
しかしなかなかうまくいかなかった.まあ結局のところこんなかんじでうまくいった.

http://techno.hippy.jp/rorwiki/?HowtoFunctionalTest

質問 2: ある@flashアイテムがセットされていたら、ビューに特定のセクションが表示されることをテストしたかったら、どうやって@flashオブジェクトをセットアップすればいい? request.session['flash']に値を設定してみたんだけど、うまくいかないみたいだった。

答え: リクエストはパラメータを4つ受け取って、最後がflashパラメータだ。 たとえば: get :index, nil, nil, { :what =&amp;gt; "ever" }

ということだった.

written by Ar- at Tue Apr 29 03:17:25 UTC 2008
#1 [donrails][rails] donrailsのBackgrounDRbをつかったpinngerが動かなくなっていたので修復
donrailsではBackgrounDRbをつかってgoogle等にpingをとばしている.
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



written by Ar- at Thu Apr 10 09:32:31 UTC 2008
#1 [apache][rails] いろんな作業のためにPHP rails mod_proxy...

とある目的で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のほうまでこの行が有効になってしまうのでありました.

とりあえずこれ以上の深追いはしないことにした.


written by Ar- at Fri Mar 28 00:20:06 UTC 2008
#1 [ruby][rails] rails 2.0.1とjrubyと。。

あくまでメインは仕事のためなんだが、仕事の実装が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締切が迫っているので本質的なところで時間が。


written by Ar- at Tue Dec 18 00:11:24 UTC 2007
#1 [rails] railsでjsとかの?以降のタイムを表示させない方法

まあ実際のとこ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"]=""

ということでいいらしい。と、おしえてくれた。

(関係者様の都合と私の忘却力により一部改変)


written by Ar- at Thu Oct 11 10:48:07 UTC 2007
#1 [rails] ActiveScaffoldの代わりになるかと期待してstreamlinedをためしてみる

残念なことに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のところは別のに変えることもできる)のでどうも気にくわない。

written by Ar- at Tue Sep 25 00:19:22 UTC 2007
#1 [holiday][rails] Bankgok timesにはRailsの記事が載っていた。

ふとプールサイドでIT記事をよんでいたらRailsの記事が。

image 

ruby1.8.6まで出てるけど1.8.5で動かすことをおすすめするとか、mac windows用One click installerがあるとかは書いてあるのだが、MVCのこととかDBのこととかは書いていない。

あろうことかコードまでもたったこれだけだがのっている。そして惜しいことにスペースが消されている。

image


written by Ar- at Tue Sep 25 00:10:52 UTC 2007
#1 [mysql][donrails][rails] そして移行のためにrake db:migrate
donrailsではながいことmigrate機能をつかってこなかった。これは
  • 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

というわけで終了


written by Ar- at Thu Jul 12 15:03:06 UTC 2007
#1 [donrails][mysql][rails] donrailsからhabtmを一掃。

rails2.0ではhas_and_belongs_to_many(habtm)がなくなってしまうので、そのための対応をやった。

具体的にはコードをみるのが速いけど、has_many:throughにするというだけでもけっこう大変で、はじめてみたらかなりの作業量になった。まあ作業のかいあって、r269からはrails2.0でも動くはず。


written by Ar- at Thu Jul 12 14:49:35 UTC 2007
#1 [donrails][rails] 入れ子コントローラ使用時のexpire_pageの使い方は要注意

事の顛末は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時間くらい費やしてしまった。


at Thu May 10 22:18:10 UTC 2007
#1 [donrails][rails] fcgiの問題? lighttpdの問題? routes.rbの解釈が違う問題

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+/
  }

at Wed May 09 02:56:57 UTC 2007
#1 [rails] Rail1.2のRC2がでた。でも2.0は半年は出さないようで
まだdonrailsはrails1.2では試してないわけですが、どうやら次くらいでrails1.2がでる雰囲気のようです。
で、気になった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.

at Fri Jan 05 07:08:23 UTC 2007