* [[Ruby on Rails]]
1.2と2.0が混在しているなー ちゃんと分けないと...~
2.2がでましたね。Ruby 1.9に対応したか!速くなるかな?~
[[国際化されたRails 2.2登場、スレッドセーフとRuby 1.9対応>http://journal.mycom.co.jp/news/2008/11/27/018/index.html]]~
#contents
** NEWS
2008/10/22~
[[Rails、PHPもサポートするフリーの統合開発環境「NetBeans IDE 6.5」RC版リリース>http://codezine.jp/article/detail/3210]]~
** 環境
http://rubygems.rubyforge.org/wiki/wiki.pl?RubyGemsよりRubyGemsをインストールしておきます。http://gesource.jp/programming/webgen/01.htmlのOne-Click Installerからでもインストールできます。
wget http://rubyforge.org/frs/download.php/5208/rubygems-0.8.11.zip
unzip rubygems-0.8.11.zip
cd rubygems-0.8.11
ruby setup.rb
あら?つながらなくなってますね。上記URLはつながらなくなってますね。ではこちらよりダウンロードします。http://rubyforge.org/frs/?group_id=126
wget http://rubyforge.org/frs/download.php/17190/rubygems-0.9.2.tgz
tar xzvf cd rubygems-0.9.2
ruby setup.rb
いまは1.0.1ですね。(2007-12-20)ではRailsもインストールしておきましょう。
gem install rails --include-dependencies
最新にする場合は、
gem update rails
windowsは[[Railsインストール>http://www.rubylife.jp/railsinstall/]]を参考に~
まず、RubyGemsをhttp://docs.rubygems.org/のダウンロードより、rubygems-1.0.1.tgzをダウンロード
rubyのディレクトリに展開後、(例:H:\ruby\rubygems-1.0.1)
cd H:\ruby\rubygems-1.0.1
ruby setup.rb
この後進んで、
As of RubyGems 0.8.0, library stubs are no longer needed.
Searching $LOAD_PATH for stubs to optionally delete (may take a while)...
...done.
No library stubs found.
H:\ruby\rubygems-1.0.1>
で終わり。[[zlib.dll>http://www.rubylife.jp/railsinstall/rubygems/index3.html]]がいる場合があるらしいので、そのときはH:\ruby\binにでもほりこんでおきます。
さてgemがはいったので、railsをいれましょう。
gem install rails --include-dependencies
んーSSLEAY32.dllやLIBEAY32.sllがないといわれましたね。[[OpenSSL for Windows>http://www.limber.jp/?Software%2FOpenSSL%20for%20Windows]]よりopenssl-0.9.8e-win32-bin_dynamic.zip をダウンロードして、解凍すればありますので、ruby\binにでもほりこんでおきましょう。あっそろそろwindowsがいやになってきた... ん?
Installing ri documentation for rake-0.8.1...
Installing ri documentation for activesupport-2.0.2...
Installing ri documentation for activerecord-2.0.2...
2.0になっていたのか。
ほかに[[iconv>http://wiki.rubyonrails.com/rails/pages/iconv/]]や[[readline>http://jarp.does.notwork.org/win32/]]は入れておきましょう。
readlineは解凍して、binにreadline.dllをコピーします。でないとruby script/consoleとしても、
c:/ruby/lib/ruby/1.8/i386-mswin32/readline.so: 126: 指定されたモジュールが見つかりません。
- c:/ruby/lib/ruby/1.8/i386-mswin32/readline.so (LoadError)
とかってエラーがでます。
ではDEMOを動かしてみましょう。適当なディレクトリで、
rails demo
cd demo
ruby script/server
デフォルトでポート3000をつかってWEBrickが起動しますので、ブラウザから確認してみてください。WEBrickはRubyのみで書かれたWebサーバでRubyとともにインストールされています。ちなみにdemoで
ruby script/generate controller コントローラ名
とするとMVCのコントローラが作成されます。コントローラ名は頭大文字後小文字です。そのかなにメソッドをつくり、app/views/コントローラ名/メソッド名.rhtmlをUTF-8で保存すると動きました。http://localhost:3000/コントローラ名/メソッド名
また実行して
no such file to load -- sqlite3
ってエラーが出た場合は、
gem install sqlite3-ruby
とします。それでもエラーが出る場合は、http://sqlite.org/download.htmlよりsqlite-3_5_5.zipとsqlitedll-3_5_5.zipをダウンロード(windowsの場合) 適当な場所に展開して、同一ディレクトリにコピー後パスを通します。database.ymlの設定がsqlite3になっているので、別のDBに変えてもOKです。
mysqlでも同じようなエラーがでました。leopardの場合は、
env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql5/bin/mysql_config
**アップデイト
gem update --system
gem update
**Apache
***FastCGI
[[Apache]]のFastCGIを参考に先にいれて、実行したら、
RailsFCGIHandler(NameError)
とlog/error_logに出力されていたので、先を参考に(参考http://www.ruby-forum.com/topic/56459 )~
gemは下のRuby on Railsを参考にしてください。
gem install fcgi
一応httpdを再起動して、railsのプロジェクトを作ったら、そのアプリケーションの中のpublic/.htaccessを修正します。
#RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
また必要に応じて
#RewriteBase /test
を書き換えましょう。ここで私がはまった愚かなことがあります。いくら動かしても
execle() failed: No such file or directory
や
(2)No such file or directory: FastCGI:
と表示され全く動きませんでした。cgiにしても動かない。これはFastCGIの問題じゃないやんかと思い、悩んでいると、publicの中に
dispatch.cgi
dispatch.fcgi
と2つのファイルがあります。cgi? そういえればwindowsでつくったやつをそのままコピーしな。と思い中を覗いてみると、
先頭に
#!c:/ruby/bin/ruby
なんだこれは...
#!/usr/local/bin/ruby
に書き換えると動き出しました.....
さてrails2を試してみると、ん?今度は
Invalid command 'RewriteEngine', perhaps mis-spelled or defined by a module not included in the server configuration
なんてエラーがでているな。これはmod_rewriteが入ってなかったので入れました。すると今度は
FastCGI: comm with (dynamic) server "/www/public/dispatch.fcgi" aborted: (first read) idle timeout (30 sec)
これじゃよくわからんので、わからんときはWEBrickで
ruby script/server
とするとと、
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- gettext/rails (MissingSourceFile)
gettext入ってないないか。入れた覚えはないもんな。では入れましょう。http://rubyforge.org/frs/?group_id=855より
wget http://rubyforge.org/frs/download.php/31658/gettext-1.90.0.gem
gem install gettext-1.90.0.gem
やっと動きました。
さてこのままwebrootにコピーしちゃうと、configとかdbが丸見えなんでそれはいかんでしょうってことで、webrootを仮に/webroot/usera/rootってすると
/webroot/usera/rubyを作ってそこに一式をコピーし(仮にプロジェクトをrubytest)、httpd.confに
Alias /rubytest/ "/webroot/usera/ruby/rubytest/public/"
<Directory "/webroot/usera/ruby/rubytest/public">
Options +ExecCGI
AllowOverride all
Order allow,deny
Allow from all
AddHandler fastcgi-script .fcgi
</Directory>
ってやって、.htaccessのRewriteBaseを/rubytestとしてやりました。
参考:[[Ruby-GetText-Package>http://www.yotabanana.com/hiki/ja/ruby-gettext.html]]~
[[apache に redMine をインストールの Tips>http://wiki.encom.bz/index.php/apache_%E3%81%AB_redMine_%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE_Tips]]
***Mongrel
FastCGIは確かに早いが、評判がよろしくない。apache2で動いてあまり変な動きはしてないがちょっと見合わせたほうがよさそうってことで、
MongrelをいれてApacheと連携しましょう。
gem install mongrel --include-dependencies
とるすと、linuxなんで、
Select which gem to install for your platform (i686-linux)
1. mongrel 1.1.4 (x86-mswin32-60)
2. mongrel 1.1.4 (java)
3. mongrel 1.1.4 (ruby)
4. mongrel 1.1.3 (ruby)
5. mongrel 1.1.3 (i386-mswin32)
6. mongrel 1.1.3 (java)
7. Skip this gem
8. Cancel installation
> 3
Select which gem to install for your platform (i686-linux)
1. fastthread 1.0.1 (mswin32)
2. fastthread 1.0.1 (ruby)
3. Skip this gem
4. Cancel installation
> 2
としました。
gem install mongrel_cluster
も入れておきます。
ではちょっと起動して見ましょう。
mongrel_rails start -p 8000 -e production -c /webroot/ruby/railstest -d --prefix /railstest
引数の-pはポート、-eはRails environmentなんで指定しなければdevelopment、-cでカレントディレクトリの指定、-dでデーモンで起動、--prefixでurlです。
Rails requires RubyGems >= 0.9.4 (you have 0.9.2). Please `gem update --system` and try again.
ん?エラーだ。では指示通りに、
gem update --system
gettextは上記のFastCGIを参考にして、入れておきましょう。では再度起動して動きました。
では終了してみましょう。
mongrel_rails stop -P /webroot/ruby/railstest/log/mongrel.pid
さて動作したんで、次はリバースプロキシの設定です。mod_proxyでやってみましょう。参考:[[Apache モジュール mod_proxy>http://www-pdsimage.jpl.nasa.gov/manual/ja/mod/mod_proxy.html]]
httpd.confに
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /railstest http://192.168.1.1:8000/railstest
ProxyPassReverse /railstest http://192.168.1.1:8000/railstest
を追加して再起動です。ではクラスタで複数起動するときは
mongrel_rails cluster::configure -N 2 -p 8000 -e production -c /webroot/ruby/railstest -d --prefix /railstest
mongrel_rails cluster::start
です。apache2.2だと、mod_proxy_balancerが使えるので、参考:[[Apache モジュール mod_proxy_balancer>http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy_balancer.html]]
<Proxy balancer://rails-app/>
BalancerMember http://192.168.1.1:8000/railstest loadfactor=10
BalancerMember http://192.168.1.1:8001/railstest loadfactor=10
</Proxy>
ってやるとバランサーになります。そういえば、
Ruby version is not up-to-date; loading cgi_multipart_eof_fix
ってエラーがでたことがあります。Rubyのバージョンが古いとのこと。あげとくか。
[[Mongrel HOWTO>http://synth.jp/pg/2007/05/mongrel_howto.html]]
[[Pound + Mongrel + Apache2.0 で Ruby on Rails!>http://recompile.net/2007/02/pound_mongrel_apache20_ruby_on.html]]~
[[Mongrelを使ってみる。>http://kiyoeri.gotdns.org/joomla/content/view/34/2/]]~
[[CentOS5上でRuby on RailsアプリをApacheで動かす>http://d.hatena.ne.jp/shohu33/searchdiary?word=cluster]]~
***LiteSpeed
速いらしいが調査中~
[[開発~運用Webサーバの比較>http://wota.jp/ac/?date=20060605]]~
***[[Passenger>http://www.modrails.com/]]
本命はこいつか?Mongrelもいいですよ。
gem install passenger
passenger-install-apache2-module
インストールするとメッセージが表示されていますので、それにあわせてhttpd.confを修正しましょう。ちなみに下記はleopardで実行した時のメッセージです。
LoadModule passenger_module /Library/Ruby/Gems/1.8/gems/passenger-1.0.1/ext/apache2/mod_passenger.so
RailsSpawnServer /Library/Ruby/Gems/1.8/gems/passenger-1.0.1/bin/passenger-spawn-server
RailsRuby /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
<VirtualHost *:80>
ServerName www.yourhost.com
DocumentRoot /somewhere/public
</VirtualHost>
また[[Railsをさらに加速するテクノロジー「Ruby Enterprise Edition」>http://www.moongift.jp/2008/06/ruby_enterprise_edition/]]なんてなもんも
あるようで、1.9でRailsが動いてくれるまでなんとかしのぐか。
[[Passenger users guide>http://www.modrails.com/documentation/Users%20guide.html]]~
[[チェック必須!Rails新時代の到来か?「Passenger(mod_rails for Apache)」>http://www.moongift.jp/2008/04/passenger/]]~
**Railties
Railsを利用するためのユーティリティです。
script/generate ジェネレータ ひな形作成
model モデル
scaffold モデル名 コントローラ名 アクション名 # モデル名必須 これでCRUD操作ができる
controller コントローラ
migration マイグレーション
***migrate
テーブル作成
class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.column :title, :string, :limit=>100, :null => false
t.column :description, :string
t.column :image_url, :string, :limit=>200, :null => false
t.column :price, :integer, :null => false
end
end
def self.down
drop_table :products
end
end
カラム追加
class AddDateAvailableToProduct < ActiveRecord::Migration
def self.up
add_column :products,:date_available,:datetime
end
def self.down
remove_column :products,:date_available
end
end
developmentではなくproductionに適用したい場合は、EclipsのRakeタスクの場合、直接
RAILS_ENV=production db:migrate
と打ち込んでリターンで実行されます。
[[Ruby on Rails で使えるデータ型>http://shin.moe-nifty.com/server/2006/10/ruby_on_rails__b15d.html]]~
[[MigrationによるDB管理>http://tam.qmix.org/wiki/Migration.html]]~
**database.yml
どんな記述が追加出来るか調べていました。
development:
adapter: mysql
database: hoge_development
username: hogeuser
password: hogepass
host: 192.168.1.1
port: 3306
encoding: utf8
timeout: 5000
**environment.rb
***本番にDBを切り替える
# ENV['RAILS_ENV'] ||= 'production'
を
ENV['RAILS_ENV'] ||= 'production'
としてやります。
productionに設定すると、サーバー(httpd,mongrel等)を再起動しないとコードの変更は反映されないので、注意
**ActiveRecord
参考:[[RubyOnRails を使ってみる 【第 3 回】 ActiveRecord>http://jp.rubyist.net/magazine/?0006-RubyOnRails]]~
[[ザリガニが見ていた...。>http://d.hatena.ne.jp/zariganitosh/searchdiary?of=20&word=%2a%5bRuby%20on%20Rails%5d]]さんのページは
とても参考になります。このような方がお近くにおられれば..とよく思います。
***項目命名規約
datetime _atで終わる
date _onで終わる
外部キー ターゲットのクラス名を小文字に変えて_idをつける
***テーブル名を変更する
def self.table_name() "tablename" end
もしくは
set_table_name "tablename"
***find
idでの検索では見つからない場合、エラーとなるので捕捉してやる必要があります。
product = Product.find(params[:id])
rescue ActiveRecord::RecordNotFound
flash[:notice] = "そんなIDはない"
とか、
product = Product.find(params[:id])
rescue => ex
flash[:notice] = ex.message
とか。
***トランザクション
ActiveRecord::Base::transaction() do
rascue
end
って書き方もできるのか..
http://underrails.seesaa.net/article/54762314.html
***has_many
べたで書いた場合
has_many :data1,
:class_name => "Data1",
:finder_sql => 'select data1.* from data1,data2 where data2.id = data1.koumoku_id and data1.id = #{id}'
ダブルクォーテーションではなくシングルクォーテーションで
またファインダメソッドを使って
has_many :specific_lineitems,
:class_name => "lineitem" do
def get(id)
find :all,:conditions=>['order_id = ?',id]
end
end
とかってしてやって、
p order.specific_lineitems.get(hoge)
としてやることもできる。
p order.lineitems.find(:first,:conditions =>["order_id=?",hoge])
でいいのですが。なんか変な感じだと思っていると、order.findで子のlineitemsの条件が書き方がわからんからだー
もちろんWHERE order_id = ?ではなく、LEFT OUTER JOINに。
仮に書けたとして、includeは書けるのか?
この辺は再調査だな。でもこんなの見つけてしまったということはだめなのか?~
[[[Ruby on Rails]:include の JOIN 節に condition を追加したい。>http://d.hatena.ne.jp/osakanas/20070102/p1]]~
さて同容に孫でソートしたい場合はどうするのか?
has_many :lineitems,:include=>"lineitem",:order => "lineitems.cdkoukou"
としてやればできた。このorderは複数なのか。
[[has_manyでテーブル関連付けをしたときのDB更新>http://manesan.blog84.fc2.com/blog-entry-5.html]]~
[[ 関連とDBへの保存のタイミングを整理する>http://rails-recipebook.g.hatena.ne.jp/rrbk/20070722/1185115872]]~
***find_by_sql
@table1 = Table1.find_by_sql("select table2koumoku1 from table2")
このfind_by_sqlはTable1と関係ないtable2でのsqlを使っても取得できた。
<% for table1 in @table1 -%>
<tr>
<td><%= h(table1.table2koumoku1) %></td>
</tr>
<% end -%>
これは逃げ道になりそう?またパラメータを渡す場合は、
aaaa = "11"
@table1 = Table1.find_by_sql("select table2koumoku1 from table2 where table2koumoku1 = ?",aaaa)
とか
@table1 = Table1.find_by_sql(["select table2koumoku1 from table2 where table2koumoku1 = :id and table2koumoku2 = :id2",{:id => params[:id],:id2 => params[:id2]}])
他に
params = {}
params[:para2] = "2"
params[:para1] = "1"
find(:all,:conditions => ["code_id = :para1 and image_url = :para2",params],:order => "title")
とすると
SELECT * FROM `products` WHERE (code_id = '1' and image_url = '2') ORDER BY title
となるので、動的にSQLも書けることでしょう。
***connection.select_all
もうひとつの逃げ道として(逃げてばっかりですが..)、コントローラで
@datas = Table1.connection.select_all("select * from table2")
として、
<% @datas.each{|value| -%>
<tr>
<td><%= h(value['table2koumoku1']) %></td>
</tr>
<%} -%>
***destroyとdeleteの違い
deleteはコールバックと検証を迂回していき、直接deleteだけになり、dependentとかもよびだされません。
destroyはすべて呼び出してくれます。ですので通常はdestroyのほうがいいでしょう。
***コード管理
漢には笑わせてもらいました。
[[いまこそ ARと外部キーについて考える (舞波)>http://wota.jp/ac/?date=20061119]]
***SQL確認
ActiveRecordが生成するSQLは、logディレクトリに出力されています。Eclipseですと[[NTail>http://www.certiv.net/products/ntail.html]]というプラグインがありますので、
それで確認できます。
***リンク
[[Rails RecipeBookはてな版(多対多の関連を設定する)>http://rails-recipebook.g.hatena.ne.jp/rrbk/20070716]]~
[[「SQL書き方ドリル」のスキーマをActiveRecordで書く>http://rubyist.g.hatena.ne.jp/muscovyduck/20070322/p1]]~
**ActiveScaffold
[[優しいRailsの育て方>http://wota.jp/ac/?date=20071110]] この本はおもしろかったです。早く2版でないものでしょうか。
**GetText
エラーを日本語化したい場合、ActiveHeartよりこっちみたいな記事があったので、試してみます。
c:\ruby>gem install gettext
ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError)
接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続でき
ませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗し
ました。 - connect(2) (Errno::ETIMEDOUT)
getting size of http://gems.rubyforge.org/Marshal.4.8
ん?なんだ。ファイアーウォールではじかれていたのか。では設定です。
config/environment.rbの最初に
$KCODE='u' # u=utf s=Shift_JIS, e=EUC-JP
require 'jcode'
とし、最後に
require 'gettext/rails'
記述します。またapp/controllers/application.rbに
init_gettext "hogedom"
とテキストドメインの名前を記述しておきます。この名前はDBの項目を日本語化するときにも出てきます。
では翻訳文字を抽出する為にlib/tasksにrakeタスクをつくります。とりあえず名前はgettext.rakeで
desc "Update pot/po files."
task :updatepo do
require 'gettext/utils'
GetText::ErbParser.init(:extnames => ['.rhtml', '.erb'])
GetText.update_pofiles(
"hogedom", #<<<<<<テキストドメインの名前
Dir.glob("{app,config,components,lib}/**/*.{rb,rhtml,rjs,erb}"),
"hogedom 1.0.0") #バージョン
end
desc "Create mo-files"
task :makemo do
require 'gettext/utils'
GetText.create_mofiles(true, "po", "locale")
end
では実行しましょう。
rake updatepo
するとpoディレクトリが作成され、その中にテキストドメイン名のrailsproject.potができました。
これをpo/jaディレクトリを作成して、そこにコピーして、railsproject.poにリネームします。
po/ja/railsproject.po
中を見ると、たとえば
#: app/models/product.rb:-
msgid "Product|Title"
msgstr ""
てな感じになっているので、
#: app/models/product.rb:-
msgid "Product|Title"
msgstr "タイトル"
とか日本語を入れてやります。設定後、
rake makemo
でエラー表示の時に項目名も日本語化されます。ではコントローラのメッセージは?ということで
def create
@code = Code.new(params[:code])
respond_to do |format|
if @code.save
flash[:notice] = 'Code was successfully created.'
とかありますが、
flash[:notice] = 'Code was successfully created.'
を
flash[:notice] = _('Code was successfully created.')
にしてやり、po/ja/railsproject.poに
#: app/controllers/codes_controller.rb:-
msgid "Code was successfully created."
msgstr "登録成功!"
としてやった後にrake makemoです。ではviewも
<p>
<%= f.submit 'Update' %>
</p>
を
<p>
<%= f.submit _('Update') %>
</p>
として、po/ja/railsproject.poに
msgid "Update"
msgstr "更新!"
これってmsgidってどこでも使えるですね。
ついでに、
class Code < ActiveRecord::Base
validates_presence_of :codekn,:code,:message => "%{fn}は必須!"
set_error_message_title("%{record}にエラーがある。", "%{record}に%{num}個もエラーが...")
set_error_message_explanation("以下のエラーを確認せよ!", "ちょっとエラーが多いよ....")
end
とすると、
コードテーブルに2つのエラーが発生しました。
次の項目を確認してください。
* コードを入力してください。
* コード区分を入力してください。
ってメッセージが
コードテーブルに2個もエラーが...
ちょっとエラーが多いよ....
* コードは必須!
* コード区分は必須!
[[Ruby-GetText-Packageとは?>http://www.yotabanana.com/hiki/ja/ruby-gettext.html]]~
[[Ruby on RailsでRuby-GetText-Packageを使う>http://www.yotabanana.com/hiki/ja/ruby-gettext-howto-ror.html#Ruby+on+Rails%A4%D8Ruby-GetText%A4%CE%C5%AC%CD%D1]]~
[[Ruby on Rails]2.0でRuby-GetTextを使う>http://d.hatena.ne.jp/zariganitosh/20080129/1201580496]]~
[[MacOS X10.5 Leopard環境にRuby-GetTextをインストールする>http://d.hatena.ne.jp/zariganitosh/20080109/1199832149]]~
[[GetTextで日本語化してみる。>http://d.hatena.ne.jp/zariganitosh/20061214/1166088490]]~
[[Ruby-GetText初体験その6【po ファイルと mo ファイル】>http://rubist.blog77.fc2.com/blog-entry-79.html]]~
**デバッグ
p オブジェクト名
とすると、コンソールに表示されれるので確認
<%= debug(params) %>
[[Railsでデバッグをする7つの方法>http://blog.s21g.com/articles/212]]~
**TIPS
***とりあえず
app/controllers/コントローラ名_controller.rb
class コントローラ名Controller < ApplicationController
def メソッド名
@test = "へへっへ"
end
end
メソッド名.rhtml
<html>
<head>
<title>ほほほほー</title>
</head>
<body>
<% 3.times do |count| %>
<h1><%= count %>ひっひ-</h1>
<%= @test %>
<% end %>
</body>
</html>
ここで、JSPみたいにRubyのコードを<%で埋め込んでますが、JSPみたいなもんです。
さてscaffoldをつかったらエラーがでました。Ruby on Rails2.0から変わったんですね。
undefined method `scaffold' for AdminController:Class
その対象のプロジェクトのディレクトリで、
ruby script/plugin install scaffolding
ruby script/plugin install http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/classic_pagination/
ruby script/plugin install http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/will_paginate/
また登録したとき
ActionController::InvalidAuthenticityToken
ってでる。これも2.0からで外部から来たリクエストであればはじくようになっているそうなのだが、おそらくscaffoldがCSRFの対策をしてなくて、hiddenを埋め込んでいないからだろう。ってことで、Controllerに
skip_before_filter :verify_authenticity_token
を追加してやるとskipしてくれます。
また実際に動かしてみると、登録時に日本語で落ちる場合は、
ActiveRecord::StatementInvalid in ...
config/database.ymlにencoding:の指定を追加しましょう。dbの文字コードとあわせておきます。Rails2.0からはscaffoldが
script/generate scaffold book
から
script/generate scaffold book title:string price:integer
みたいにモデル名に後にフィールド名と:データ形式を追加するんですね。
ん?生成されたコントローラを見ると、
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @books }
end
ってあります。これって2.0からか。http://wota.jp/ac/?date=20060317#p01を参考に
参考:[[■[Ruby on Rails]2.0のscaffoldから書き直してみる>http://d.hatena.ne.jp/zariganitosh/20080127]]
***ルートページの設定
config/routes.rbに
# You can have the root of your site routed with map.root -- just remember to delete public/index.html.
# map.root :controller => "welcome"
とかってありますので、
map.root :controller => "login", :action=>"login"
とかに変更して、public/index.htmlを消しておきます。
***部分テンプレート
頭にアンダーバー(_)をつける。
<%= render(:partial => "cartitem",:collection => @cart.items) %>
このような場合、_cartitem.html.erbという部分テンプレートをしようすることになる。
またここではcollectionにセットをしている為、_cartitem.html.erbはそのcollectionの要素数分(@cart.items.size)回る。
_cartitem.html.erbではこのcollectionの要素はcartitemでアクセスできる
<li><%= h(cartitem.quantity)%>個<%= h(cartitem.price)%>円 <%= h(cartitem.title)%></li>
みたいに。このcollectionは他にもobjectとか指定可能
***cycle
<%= cycle(i, "") -%>
とかって書けば、一つとばしに出力されるのかなーと思っていたけど、値が変わる場合はだめでした。
そりゃそうか。~
[[cycleヘルパーを使ってテーブルをストライプにする>http://brass.to/blog/rails_helper_cycle.html]]~
***スクリプト
rails プロジェクト名 #プロジェクト作成
ruby script/server -e development(test,production) #サーバ起動
ruby script/generate scaffold モデル名 コントーラ名 ※2.0違います。
ruby script/generate ajax_scaffold モデル名 コントーラ名 ajax
ruby script/generate controller コントローラ名 #コントローラ作成
ruby script/generate model テーブル名 #モデル作成 単数形で
ruby script/destroy ファイル削除
ruby script/runner メソッドをコンテキスト外で動かすことができるみたい。
***コールバッグフック
def before_create #保存前にフック
def after_create #保存後にフック
def before_destroy #削除前にフック
***チェック
必須チェック
validates_presence_of :項目
ユニーク
validates_uniqueness_of :項目
ここで項目が2つでユニークって場合で,たとえばhoge1の中でhoge2は重複したらだめという場合は、
validates_uniqueness_of :hoge2,:scope => :hoge1
ん?3つの場合はどうすんだ?
validates_uniqueness_of :hoge3, :scope => [:hoge1, :hoge2]
でいいのか。
数値チェック
validates_numericality_of :項目
[[ActiveRecord::Validations::ClassMethods>[http://techno.hippy.jp/apidoc/classes/ActiveRecord/Validations/ClassMethods.html]]~
[[Rails1.2.3 ActiveRecordで日付チェック(Validates Multiparameter Assignmentsプラグイン)>http://d.hatena.ne.jp/bottleneck/20071022/1193038706]]
***モデルにエラーを追加する場合
model.errors.add_to_base("エラーを追加")
***collection_select
<%= collection_select("user",user.code,@users,"code","name",{:include_blank => true})%>
とかしてもうまくselecedがついてくれないので、とりあえず、ApplicationHelperに
def select_ext (strName,strCode,arrData,value,outdata,isBlank)
strReturn = '<select id="'+strName+'_'+strCode+'" name="'+strName+'[' + strCode + ']">'
if isBlank == true
strReturn += '<option value=""></option>'
end
for oneData in arrData
if (strCode == oneData[value])
strReturn += '<option value="'+oneData[value]+'" selected="selected">'+oneData[outdata]+'</option>'
else
strReturn += '<option value="'+oneData[value]+'">'+oneData[outdata]+'</option>'
end
end
strReturn += "</select>"
return strReturn
end
とかしてviewから呼び出して逃げてます.. はやく調べんと..
codes = Code.find(:all,:order => "id").map {|u| [u.nmname,u.id]}
f.select(:code_id,codes,{:include_blank => true})
と思ったらあっさりOK。
codes = Code.find(:all,:order => "id")
f.collection_select(:code_id,codes,:id,:code,{:include_blank => true})
もOK。
f.collection_select(:code_id,Code.find(:all,:order => "id"),:id,:code,{:include_blank => true})
でもOK。書式は
collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {})
なので、
f.collection_select(:code_id,Code.find(:all,:order => "id"),:id,:code,{:include_blank => true},{"name"=>"hohogee"} )
と指定できる。
[[collection_select>http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#M000941]]や[[select>http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html]],
[[Rails のコンボボックス(select)を生成する時の tabindex 属性の指定の仕方について>http://oshiete1.goo.ne.jp/qa3306663.html]]
を参照
***複数のsubmitボタン (2.0)
とりあえず、やってみた。viewで
<%= f.submit 'ボタン1',:name=>'aa' %>
<%= f.submit 'ボタン2',:name=>'aa2' %>
で、controllerで
def update
unless params[:aa].nil?
p "aa != nil";
end
unless params[:aa2].nil?
p "aa2 != nil";
end
ただこれ、disable_withを指定するとparamsにセットされなくなるな。なんでだ?
[[同一フォームに複数のイメージ送信ボタン>http://pirochin.blogspot.com/2007/02/blog-post.html]]~
http://www.fdiary.net/ml/rails/msg/207 リンクきれてるな~
***複数モデルの保存 (2.0)
では早速サンプルを。ついでに複数ボタンも
<% form_tag(:action => 'update1') do %>
<% for @code in @codes %>
<%= text_field("code[]", 'nmname') %><br>
<% end %>
<%= submit_tag 'こっちだけ更新',:name=>'aa1' %>
<%= submit_tag 'なにもしない',:name=>'aa2' %>
<% end %>
この2行目でcodeを@codeとインスタンス変数にして、
3行目でcodeに[]をつけてやってます。するとhtmlは
<form action="/codes/update1" method="post">
<input id="code_1_nmname" name="code[1][nmname]" size="30" type="text" value="ddd" /><br>
<input id="code_2_nmname" name="code[2][nmname]" size="30" type="text" value="bdddd" /><br>
<input id="code_3_nmname" name="code[3][nmname]" size="30" type="text" value="cfffff" /><br>
<input name="aa1" type="submit" value="こっちだけ更新" />
<input name="aa2" type="submit" value="なにもしない" />
</form>
と生成してくれます。ではcontrollerで
def update1
#p params
unless params[:aa1].nil?
params[:code].each{|key,value|
Code.update(key,:nmname => value[:nmname])
}
end
redirect_to :action => 'index'
end
とすれば更新できます。
params[:code].each{|key,value|
Code.update(key,:nmname => value[:nmname])
}
は
Code.update(params[:code].keys,params[:code].values)
と簡単に記述できます。~
form_forをつかってみましょう。ついでにform_forに適当なhogeを設定しておいて、
<% form_for :hoge, :url => {:action => 'update1'} do |f| %>
<%= f.text_field :nmname %><br>
<% for @code in @codes %>
<%= text_field("code[]", 'nmname') %><br>
<% end %>
<%= submit_tag 'こっちだけ更新',:name=>'aa1' %>
<%= submit_tag 'なにもしない',:name=>'aa2' %>
<% end %>
でhtmlは
<form action="/codes/update1" method="post">
<input id="hoge_nmname" name="hoge[nmname]" size="30" type="text" /><br>
<input id="code_1_nmname" name="code[1][nmname]" size="30" type="text" value="dddd" /><br>
<input id="code_2_nmname" name="code[2][nmname]" size="30" type="text" value="bddddfd" /><br>
<input id="code_3_nmname" name="code[3][nmname]" size="30" type="text" value="cfffffa" /><br>
<input name="aa1" type="submit" value="こっちだけ更新" />
<input name="aa2" type="submit" value="なにもしない" />
</form>
ちゃんとidやnameにhogeがつきました。ちなみにselectの場合は、
<%= collection_select("code[]", 'code',@codes,:code,:nmname) %>
でいけるので、同じです。
参考~
[[1アクションで複数のモデルを同時に保存するには?>http://d.hatena.ne.jp/zariganitosh/20080101/1199154980#20080101fn1]]~
[[A Day In The Life(Railsで複数行更新)>http://blog.goo.ne.jp/glass-_-onion/e/094c07e7e011b11937da3c75a89f93f9]]~
[[ぺんちゃん日記(text_fieldなどのフォームを配列化する)>http://www.pen-chan.jp/~tdiary/pen-chan/20070618.html]]
***paginate (1.2)
モデルに対しては
@pages, @users = paginate(:users, :order_by => 'usercode')
とかすればいいのだが、そんな単純なケースでない場合、Paginatorを使うことになる。http://wota.jp/ac/?date=20050629にも書かれていますが、ほんとpaginate_by_sqlてなものがほしいです。
per_page = 5
@tmp = Jikanwari.find_by_sql(["select count(*) as cnt from jikanwari where youbi <> ?","7"])
count = @tmp[0].cnt.to_i
@pages = Paginator.new(self, count, per_page, @params['page'])
@jkanwaris = Jikanwari.find_by_sql(["select * from jikanwari where youbi <> ? LIMIT ? OFFSET ?", "7", per_page, @pages.current.to_sql[1].to_i])
でviewに
<%= pagination_links(@pages) %>
***paginate(2.0)
[[classic_pagination を will_paginateに置き換えてみた。>http://d.hatena.ne.jp/curi1119/20071216/1197808873]]
***フィルター
before_filter :メソッド名1 :except => :メソッド2
メソッドの呼び出し前にメソッド名1を呼び出します。ただしメソッド2は除きます。
***フォームヘルパー
-link_to~
コントローラを指定したい場合
<%= link_to '登録', :controller => 'conta', :action => 'index' %>
さてRails2.0よりscaffoldで生成したhtml.erbを見ると
<%= link_to 'Edit', edit_flower_path(flower) %>
ってなっていたんです。なんじゃこれ?edit_モデル名_path?
[[Ruby on Rails/第11回勉強会 - RESTful Rails Development>http://www.ark-web.jp/sandbox/wiki/index.php?Ruby%20on%20Rails%2F%C2%E811%B2%F3%CA%D9%B6%AF%B2%F1%20-%20RESTful%20Rails%20Development]]のREST-URLs and Views あたりを読んでみよう。
また[[2.0のscaffoldから書き直してみる>http://d.hatena.ne.jp/zariganitosh/20080127 ]]や、
[[2.0のmap.resourcesのオプション設定いろいろ>http://d.hatena.ne.jp/zariganitosh/20080203/1202091772]]
がとても参考になりました。[[RailsによるアジャイルWebアプリケーション開発>http://www.amazon.co.jp/exec/obidos/ASIN/4274066967/worried-22]]のP378も参照に。~
確認は
rake routes
で
-form_tag~
<%= form_tag :controller => 'conta',:action => 'touroku' %>
さて2.0にすると、
undefined local variable or method `end_form_tag' for #<ActionView::Base:0x4e44aa4>
とエラーが..end_form_tagはなくなったんですね。endです。
-text_field_tag
<%= text_field_tag("koumokumei", atai,options = {:maxlength=>3,:size=>3}) %>
DBとか絡まない場合。
hiddenではhidden_field_tagがある。
-button_to~
formを含んだsubmitボタンを生成します。formを含んだ? サンプルで確認しましょう。
<% for product in @products -%>
<%= product.title %><br>
<%= text_field_tag :title, product.title %><br>
<%= button_to "カーとに入れる",{:action=> :add_to_cart, :id=>product,:para1=>product.price},{:confirm => "Are you sure?"} %>
<hr>
<% end %>
このようにforでまわした場合は、どうなるかですが、
ひひい<br>
<input id="title" name="title" type="text" value="ひひい" /><br>
<form method="post" action="/store/add_to_cart/2?para1=1.0" class="button-to">
<div>
<input onclick="return confirm('Are you sure?');" type="submit" value="カーとに入れる" />
<input name="authenticity_token" type="hidden" value="601ad11f3a639c4de81b4c96485842f15ee51f26" />
</div>
</form>
<hr>
ほほー<br>
<input id="title" name="title" type="text" value="ほほー" /><br>
<form method="post" action="/store/add_to_cart/1?para1=100.0" class="button-to">
<div>
<input onclick="return confirm('Are you sure?');" type="submit" value="カーとに入れる" />
<input name="authenticity_token" type="hidden" value="601ad11f3a639c4de81b4c96485842f15ee51f26" />
</div>
</form>
<hr>
となりました。para1とかはちゃんとformにくっついているんですが、このtext_field_tagに関しては、form内
にないです。ということは自分だけで完結するformとsubmitを用意してくれるヘルパーです。
***コントローラ名取得
<%= controller.action_name%>
***Ajax
まずjavascriptsを使えるようにしておきます。javascriptsはpublic/javascriptsにいます。html.erbを開いて
<%= javascript_include_tag :defaults %>
としておくと、
<script src="/javascripts/prototype.js?1204131898" type="text/javascript"></script>
みたいに生成されます。そして、
<% form_tag(:action => 'add_to_cart',:id=>product) do %>
とかなっているところを
<% form_remote_tag :url=>{:action=>:add_to_cart,:id=>product} do%>
とform_remote_tagに変更します。htmlは
<form action="/store/add_to_cart/3" method="post" onsubmit="new Ajax.Request('/store/add_to_cart/3', {asynchronous:true, evalScripts:true,
parameters:Form.serialize(this) + '&authenticity_token=' + encodeURIComponent('da20420b9451c0hohohohohohohoho')});
return false;">
とできてます。このAjax.Requestはprototype.jsですね。parameters:Form.serialize(this)になっているので、formの要素を/store/add_to_cart/3に
送ってくれます。で、store_controllerのadd_to_cartメソッドが実行されますが、レンダリングでhtml.erbからrjsにします。このRJSはおもしろいので、
後でちゃんと勉強するとして、add_to_cart.rjsの中身は
page.replace_html("cartid",:partial=>"cart",:object=>@cart)
とした場合、雰囲気はrenderに似ていますが、要は部分テンプレートcartにあるcssのidがcartidの要素を置き換えてくれます。
@cartは部分テンプレートで使うオブジェクトになります。
ということは、store_controller#add_to_cartのレンダリングはadd_to_cart.rjsをつかってidの中身をおきかえてくれるんですね。
こりゃ便利!さらにデバッグはfirebugを使って、NetのXHRを選択すれば、追うことができます。
ajax_scaffoldを使う場合
gem install ajax_scaffold_generator
***RJS
html.erbを
<%= javascript_include_tag :defaults %>
<div id="hoge">
hoho
</div>
として、pageをrjsに書いてどうなるかみてみます。
<%= javascript_include_tag :defaults %>
をしておくと、public\javascripts配下のjsをインクルードしてくれてます。
<script src="/javascripts/prototype.js?1204131898" type="text/javascript"></script>
<script src="/javascripts/effects.js?1204131898" type="text/javascript"></script>
<script src="/javascripts/dragdrop.js?1204131898" type="text/javascript"></script>
<script src="/javascripts/controls.js?1204131898" type="text/javascript"></script>
<script src="/javascripts/application.js?1203128030" type="text/javascript"></script>
後ろについている?1203128030は勝手につきます。おそらくブラウザにキャッシュされるのを防ぐためでしょう。
-replace_html~
page.replace_html("hoge",:partial=>"cart",:object=>@cart)
とすると、部分テンプレート_cartでhogeを置き換えます。ちなみに
page.replace_html("hoge",:partial=>"cart",:object=>@cart,:locals=>{:hogepara=>'hogehoge'})
とかしたら、部分テンプレート_cartで
<%= hogepara %>
とかで使えます。
-insert_html
page.insert_html :top,'hoge',"追加ーtop"
page.insert_html :before,'hoge',"追加ーbefore"
page.insert_html :after,'hoge',"追加ーafter"
page.insert_html :bottom,'hoge',"追加ーbuttom"
とすると
追加ーbefore
<div id="hoge">
追加ーtop
hoho
追加ーbuttom
</div>
追加ーafter
FirefoxのDOM Inspectorで確認しました。
page.insert_html :top,'hoge',content_tag("div", "追加ーtop")
であれば、
<div>追加ーtop</div>
になります。ではテーブルに追加してみましょう。html.erbが
<table>
<thead><th>カラム名</th></thead>
<tfoot></tfoot>
<tbody id="target">
<tr><td>ああああ</td></tr>
</tbody>
</table>
として、
page.insert_html :bottom, 'target', content_tag("tr", content_tag("td","だだだ"))
とすると行が増えていきます。
参考:[[Ajax でテーブルへの追加>http://d.hatena.ne.jp/maluboh/20070412]]~
またidとか指定する場合は、
page.insert_html :bottom, 'target', content_tag(:tr, content_tag(:td,"だだだ",:id => :tr1))
とできます。またシンボルに変更してます。
-update~
page['hoge'].update('aaaa').show
とすると、hogeがaaaaにupdateされます。
-effect~
ActionView::Helpers::ScriptaculousHelperを使ってやるといろいろとエフェクトをかけれます。
page.visual_effect :grow, :tr1, :duration => 0.6
やidをいきなり指定して、
page[:currentitem].visual_effect :highlight,:startcolor => "#88f88",:endcolor => "#114411"
とかするとエフェクトをかけれます。
-sortable_element~
[[マウスで握って並べ替える。>http://d.hatena.ne.jp/zariganitosh/20070722/1185150881]]
参考:~
[[RubyOnRails を使ってみる 【第 7 回】 RJS を使ってみる>http://jp.rubyist.net/magazine/?0014-RubyOnRails]]~
[[RJSでテーブルを操作する時の注意>http://d.hatena.ne.jp/yotaropg/20070603/1180882521]]~
[[Rails RecipeBookはてな版>http://rails-recipebook.g.hatena.ne.jp/rrbk/20071125]]~
***セッションをDBに
rake db:sessions:create
とすると
create db/migrate/XXX_create_sessions.rb
と作成されるので、
rake db:migrate
でsessionsテーブルができてます。そしてconfig/environment.rbを開いて
# config.action_controller.session_store = :active_record_store
を
config.action_controller.session_store = :active_record_store
としてやります。さてサーバ再起動で、
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:478:
in `const_missing': uninitialized constant CGI::Session::ActiveRecordStore (NameError)
from c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/session_management.rb:24:
in `const_get'
from c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/session_management.rb:24:in `session_store='
ってエラーが出た... なんじゃ んー
ではactiverecodeをつかってるいんだろうから、config/environment.rbのはじめのほうに
require 'active_record'
を追加。どうかな?おっ動いた!では実際にアプリを動かしてみると、
ActionController::InvalidAuthenticityToken in Store#index
No :secret given to the #protect_from_forgery call.
Set that or use a session store capable of generating its own keys (Cookie Session Store).
んー ではメッセージにしたがってActionControllerを見てみましょう。
protect_from_forgery # :secret => '11771fd07d754cc5380bdhohohhhoh'
これのとことか。コメントをはずしてやって
protect_from_forgery :secret => '11771fd07d754cc5380bdhohohhhoh'
すると動き始め、sessionテーブルを覗くと保存されています。
消したい場合は、
db:sessions:clear
で
***Shift-JIS
Shitf-JISにこだわっているわけではなく、他の文字コードを使う場合は、どうするのかを調べていた。仮にDBをsjisにした場合、database.ymlに
encoding: sjis
を追記した。またenvironment.rbに
$KCODE = 's'
を追加してみたが、文字化けは変わらなかったので、
application.rbを
class ApplicationController < ActionController::Base
# Pick a unique cookie name to distinguish our session data from others'
session :session_key => '_rubytest_session_id'
before_filter :set_charset
private
def set_charset
headers["Content-Type"] = "text/html; charset=Shift-JIS"
end
end
にすると表示されるようになった。しかし、これでやるとmodels/hogetable.rbで
validates_presence_of :title,:message => "に空はだめ"
とか日本語にすると落ちてしまうので、before_filterをやめて、environment.rbの最後に
$KCODE = 'SJIS'
ActionController::Base.default_charset = 'Shift_JIS'
としてやると日本語で出力されました。出力はされましたが、こんなことを全てに書いていてはどうしようもありません。
RUBY_HOME\gems\1.8\gems\activerecord-1.15.3\lib\active_record\validations.rb
にメッセージがあり、
@@default_error_messages = {
:inclusion => "is not included in the list",
:exclusion => "is reserved",
:invalid => "is invalid",
:confirmation => "doesn't match confirmation",
:accepted => "must be accepted",
:empty => "can't be empty",
このあたりを書き換えれば、いけそうなんですが、それもどうかと思い、調べていると、new_errorsってなものがありました。http://wiki.rubyonrails.com/rails/pages/HowToWritePluginToModifyRailsCoreを参考に
ruby script/generate plugin new_errors
を実行し、
RUBY_HOME\depot\vendor\plugins\new_errors\init.rb
に、
require 'new_errors'
を追加して、
RUBY_HOME\depot\vendor\plugins\new_errors\lib\new_errors.rb
に
module ActiveRecord
class Errors
@@default_error_messages[:inclusion] = "is not included in the list ignoramus."
@@default_error_messages[:exclusion] = "is reserved. Pay attention!"
@@default_error_messages[:invalid] = "is invalid, moron.う"
@@default_error_messages[:confirmation] = "doesn't match confirmation. Pick something that does!"
@@default_error_messages[:accepted ] = "must be accepted or it will not work."
@@default_error_messages[:empty] = "空は駄目よ"
@@default_error_messages[:blank] = "ブランクはいかん"
@@default_error_messages[:too_long] = "長すぎ (max is %d characters). IT IS TOO LONG!!!"
@@default_error_messages[:too_short] = "短すぎ (min is %d characters). t.o.o.s.h.o.r.t."
@@default_error_messages[:wrong_length] = "is the wrong length (should be %d characters). I'm sorry. That is an incorrect response."
@@default_error_messages[:taken] = "has already been taken by your mom."
@@default_error_messages[:not_a_number] = "数字じゃないやん. Numbers are things like 01234 ok?"
end
end
を追加して、修正して実行し、WEBrickを再起動すると、
@@default_error_messages[:blank] = "ブランクはいかん"
で
new_errors.rb:10: Invalid char `\203' in expression (SyntaxError)
とエラーで立ち上がりません。んー UTF-8で保存するととりあえず、立ち上がりましたが、その場合は文字化け... では RUBY_HOME\gems\1.8\gems\activerecord-1.15.3\lib\active_record\validations.rb
ではどうなんだろうと思い修正すると、うまく表示された.... 当分解決方法が見つかるまではこれでいこう...
あとは
4 errors prohibited this product from being saved
There were problems with the following fields:
を何とか日本語にせんと。ん?Shift-JISからずれてきているような気が。あれ?http://jp.rubyist.net/magazine/?0012-RubyOnRailsやhttp://www.hackmylife.jp/archives/rails/を参照させていただくとActiveHeartなるものがあるではないか。
こいつをvendor\plugins\active_heartにコピーして動かすと、あー日本語になった。もしやvendor\plugins\active_heart\lib\active_record_messages_ja.rbをShift-JISにすればいけるのかなと思い、やってみましたが、エラーで立ち上がりませんでした...~
となると次に気になるのは項目名です。モデルに
class Product < ActiveRecord::Base
set_field_names :title => 'タイトル', :description => '説明', :image_url =>'イメージURL',:price => '価格'
とかしてやると、(UTF-8で保存)、エラー時の項目名は、無事日本語になりました。リスト(list.rhtml)の方はどうかと思って見てみると、変わってないやん... そりゃそうか。
column.human_name
でタイトル表示しているからでした。
Product.human_attribute_name(column.human_name)
あれ?日本語化されんぞ? active_record_messages_ja.rbを見ていると、
def human_attribute_name(attribute_key_name)
if @field_names && @field_names[attribute_key_name]
@field_names[attribute_key_name]
else
_human_attribute_name(attribute_key_name)
end
end
の
_human_attribute_name(attribute_key_name)
に入ってる。ん?human_name? これって、先頭が大文字になっているからか。では、
Product.human_attribute_name(column.name)
にしてやれば、うまくタイトルが日本語で出力されました。さてこうなったらnew.rhtmlや、edit.rhtmlもやってしまいましょう。ん?
edit.rhtmlを見ると、
<%= render :partial => 'form' %>
となってます。この:partialは部分テンプレートなので、ということはアンダーバーをつけた_form.rhtmlがいるはずなので、覗いてみると、げっ!ここはハードコーディングか...
<%= Product.human_attribute_name("title") %>
に変更しました。new.rhtmlも<%= render :partial => 'form' %>になっているので、かってに直っていることでしょう。
***複数形の確認
Loading test environment (Rails 2.0.2)
>> "book".pluralize
"book".pluralize
=> "books"
>> "books".singularize
"books".singularize
=> "book"
*** YAML
YAMLを読み込む場合
yamlfile = YAML::load(File.open('hoge.yml'))
***二重送信防止
disable_with
でボタン押下後、表記がかわる。たとえばボタン名称は検索だけど、
クリックすれば、処理中に変わる。
<%= submit_tag '検索',:name=>:seek,:disable_with=>"処理中..." %>
ただし、paramsには params[:seek]に'検索'って文字列がはいっていたが
disable_withをつけるとそもそもparams[:seek]がない。んー
***Oracle
http://wiki.rubyonrails.org/database-support/oracle
***Mongrel Time out
朝webサーバにつなぐとまったくつながらず。Mongrelを再起動するとつながったのですが、production.logを見てみると
Status: 500 Internal Server Error
Mongrel timed out this thread: shutdown
apacheは
[Wed Apr 01 10:24:03 2008] [error] [client 192.168.1.1] proxy: error reading status line from remote server 127.0.0.1
[Wed Apr 01 10:24:03 2008] [error] [client 192.168.1.1] proxy: Error reading from remote server returned by /hoge
とエラーが発生しています。
どうも
[[Rails + MySQL (+ Mongrel?) でDB接続の通信が無い状態が続くとデッドロックする。>http://d.hatena.ne.jp/koseki2/20070130/railslockup]]や
[[MySQLのinteractive_timeout>http://d.hatena.ne.jp/yaneurao/20061020]]ぽいのですが、MySQLのinteractive_timeoutとwait_timeoutに関係がありそうです。~
うちの環境では、
/usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/connection_specification.rb
を見てみると、
@@verification_timeout = 0
になっていたんで、config/environment.rbに
ActiveRecord::Base.verification_timeout = 14400
を追記してます。mysql側は
show variables;
で確認すると、interactive_timeout、wait_timeoutともに28800でした。
mysqlのmy.cnfに
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
とすれば期間を延ばせるんですが、これは最終手段だよな~ 普通再度コネクトしなおすだけでいいような気がするんですが。
***render、redirect_toの違い
単純にフォワード、リダイレクトだと思う。
[[リダイレクトとフォワードの違いを知る>http://www.atmarkit.co.jp/fjava/javatips/062jspservlet029.html]]
**未解決
***class_eval
active_record_messages_ja.rbで使われていたのですが、?
***datetimeが化ける
登録は普通にできるのですが、product.send(column.name)で表示してみると、そこだけ化けてしまいます。ブラウザの文字エンコーディングをshiftjisにしてみると見えるが、他の項目が化けてしまってます。正しい表示は、
Sun Mar 12 00:55:00 東京 (標準時) 2006
とりあえずかっこ悪いので、strftime("%Y/%m/%d %H:%M:%S")で逃げてます。
*** Mysql::Error: Lost connection to MySQL server during query:
たまにこのようなエラーがでる。とりえあず
gem install mysql
としていれてみた。~
ERROR: Error installing mysql:
ERROR: Failed to build gem native extension.
ってエラーが出る場合は、
gem install mysql -- --with-mysql-dir=/usr/local/mysql
とかにしてみよう。
[[Lost connection to MySQL server during query>http://idm.s9.xrea.com/ratio/2006/04/08/000406.html]]~
[[[Ruby on Rails] MySQLの Lost connectionエラー>http://d.hatena.ne.jp/someeda/20060311]]~
***
**TODO
***早く[[ext]]と連携させたい~
[[Lipsiadmin>http://rails.lipsiasoft.com/wiki/lipsiadmin]]~
[[Ext plugin>http://wota.jp/ac/?date=20070406]]|~
***errors.reject
error_messages_forの編集方法~
参考:[[独自 error_messages_for の作成>http://underrails.seesaa.net/article/79019158.html]]
***[[redMine>http://redmine.jp/]]
プロジェクト管理ソフトウェアだそうです。ソースを見せてもらって勉強させてもらおう
[[Ruby on Railsで作られたプロジェクト管理ツールredMineを使ってみよう>http://gihyo.jp/dev/serial/01/redmine]]
**リンク
[[api>http://api.rubyonrails.org/]]~
[[Rails API ドキュメント>http://railsapi.masuidrive.jp/]]~
[[ActiveRecord>http://activerecord.rubyforge.org/classes/ActiveRecord.html]]~
[[RubyOnRails を使ってみる>http://jp.rubyist.net/magazine/?0004-RubyOnRails]]~
[[Rubyでアジャイルプロトタイピング>http://www.atmarkit.co.jp/farc/rensai2/proto01/proto01a.html]]~
[[ajax_scaffold_generator>http://rubyforge.org/projects/ajaxscaffold/]]~
[[Ruby Library Report 【第 3 回】 O/R マッピング>http://jp.rubyist.net/magazine/?cmd=view&p=0004-RLR&key=ActiveRecord]]~
[[RubyOnRails を使ってみる 【第 8 回】 Rails はまり道>http://jp.rubyist.net/magazine/?0015-RubyOnRails]] 出退勤のサンプルを題材としておられます。~
[[pagination>http://wota.jp/ac/?date=20050629]]~
[[AvailableGenerators>http://wiki.rubyonrails.com/rails/pages/AvailableGenerators]]~
[[メーリングリスト>http://www.fdiary.net/ml/rails/]]~
[[RailsでWikiクローンを作る>http://tam.qmix.org/wiki/Minki00.html]]~
[[WebプログラマはRailsに乗るべきか?>http://www.atmarkit.co.jp/fjava/column/andoh/andoh29.html]]~
[[Ruby on Rails on MacOSXでWebアプリ開発>http://blog.matake.jp/archives/ruby_rails/]]~
[[Rails Plugins...>http://blog.netswitch.jp/articles/2006/01/14/rails-plugins]]~
[[Ruby on Railsのチームから学ぶ仕事術>http://www.atmarkit.co.jp/fjava/column/andoh/andoh30.html]]~
[[境界を越える: アクティブ・レコードを探る>http://www-06.ibm.com/jp/developerworks/java/060331/j_j-cb03076.shtml]]~
[[Java開発者のためのRubyガイド>http://codezine.jp/a/article/aid/1439.aspx]]~
[[Ruby on Rails 初心者の館>http://www.h6.dion.ne.jp/~knt/]] Aptana + InstantRailsを使った環境の構築をWinkをつかってわかりやすく説明してあります。~
[[Ruby on Rails チュートリアル集>http://diaspar.jp/node/81]] ~
10分で作るWikiがあります。実際は12分らしいですが、たいしたもんだ。~
[[Ruby on Rails 2.0にアップグレードする方法>http://builder.japan.zdnet.com/news/story/0,3800079086,20365934,00.htm?ref=rss]]~
[[Ruby on Rails チュートリアル 「Webアプリケーション開発方法」>http://www008.upp.so-net.ne.jp/letitbe/rails009.htm]]~
[[Visual Studioを使ってRails開発「Ruby In Steel Personal Edition 2008」>http://www.moongift.jp/2008/10/ruby_in_steel_personal_edition_2008/]]~
Visual Studioは使わないのですが、一応~
[[RJSなら数行のRubyコードでAjaxアプリを作成できる>http://www.atmarkit.co.jp/fcoding/articles/rjs/02/rjs02a.html]]~
[[Railsでレガシーデータを蘇えらせるテクニック>http://www.atmarkit.co.jp/fdb/rensai/08_db2onror/db2onror05.html]]~
[[どこでもできるRails開発「Ruby on Rails Portable」>http://www.moongift.jp/2008/11/ruby_on_rails_portable/]]~
[[Rails製のシンプルなEコマースシステム「EcomPages」>http://www.moongift.jp/2008/11/ecompages/]]~
[[Rails 2.2 について興味が湧いたところだけ見てみました>http://d.hatena.ne.jp/takihiro/20081125/1227599223]]~
[[created_at、updated_atの実装コードを追ってalias_method_chainを理解する>http://d.hatena.ne.jp/zariganitosh/20081225/1230147759]]~
[[Rails 2.1・その12(DBに登録してあるUTC日付データを簡単変換)>http://rubist.blog77.fc2.com/blog-entry-141.html]]~
** 参考書籍
[[RailsによるアジャイルWebアプリケーション開発>http://www.amazon.co.jp/exec/obidos/ASIN/4274066401/worried-22]]~
Railsをやるのであればとりあえず買っておきたい本です。
** コメント
-#comment