pluginのインストールとか
Railsでは追加機能や、基本機能の拡張などを plugin という方法で行います。pluginは様々なところで公開していて、プロジェクトごとにインストールして使用します。pluginの管理には基本、script/plugin を使います。このコマンドでSVNを使ってネットから必要なプラグインを探したり、ダウンロードしてインストールしたりします。
簡単な使い方
利用可能なプラグインの一覧を表示。
$ ruby script/plugin list account_location http://dev.rubyonrails.com/svn/rails/plugins/account_location/ acts_as_list http://dev.rubyonrails.com/svn/rails/plugins/acts_as_list/ acts_as_nested_set http://dev.rubyonrails.com/svn/rails/plugins/acts_as_nested_set/ ・・・
一覧の右にあるように、デフォルトでは http://dev.rubyonrails.com/svn/rails/plugins/ に公開されているプラグインのみが対象となります。
プラグインのインストールは、install を使用します。scaffolding プラグインをインストールしてみます。
$ ruby script/plugin install scaffolding + ./MIT-LICENSE + ./README + ./Rakefile + ./init.rb + ./lib/scaffolding.rb ・・・
プラグインのリポジトリはいっぱいあって、discover -l でその一覧が確認できます。
$ ruby script/plugin discover -l http://www.agilewebdevelopment.com/plugins/ svn://rubyforge.org/var/svn/expressica/plugins/ http://soen.ca/svn/projects/rails/plugins/ http://technoweenie.stikipad.com/plugins/ ・・・
デフォルトに無いプラグインは、そのリポジトリを追加する必要があります(もしくはインストール時にフルパスで指定する)。 Railsによるアジャイル〜 rail2.0版 その1で出て来た pagination プラグインは、デフォルトにはなく、http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/ リポジトリにあります。これを追加します。
$ ruby script/plugin source http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/
sources で現在のリポジトリリストを確認できます。デフォルトの dev.rubyonrails.com と二つあります。
$ ruby script/plugin sources http://dev.rubyonrails.com/svn/rails/plugins/ http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/
ちなみに、discover を引数無しで実行すると、全てのリポジトリに対して追加するかどうか、Y/Nで答えて、Yならば追加されます。あまり多く追加しすぎるとプラグインの検索に時間がかかるので、必要なものだけにするのがよいかと思います。
また、間違えて登録してしまった場合は unsource リポジトリURL で、リポジトリをリストから除外することが出来ます。詳しくは、 script/plugin -h でヘルプが見れます。
さて、tools.assembla.com を追加したので、もう一度 list で確認してみます。
$ ruby script/plugin list ・・・ classic_pagination http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/classic_pagination/ ・・・ will_paginate http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/will_paginate/
先ほどより増えているのが分かります。その中にある、classic_pagination と will_paginate をインストールします。
$ ruby script/plugin install classic_pagination + ./CHANGELOG + ./README + ./Rakefile + ./init.rb + ./install.rb + ./lib/pagination.rb ・・・ $ ruby script/plugin install will_paginate + ./LICENSE + ./README + ./Rakefile + ./init.rb + ./lib/will_paginate/collection.rb ・・・
とりあえずこれで、scaffold を使う準備ができました。
Railsによるアジャイル〜 rail2.0版 イテレーションA1
「RailsによるアジャイルWebアプリケーション開発」第2版にそってrails2.0でやってみる。6章のチュートリアルから。
ちなみに、rails2.0の参考したのは、http://api.rubyonrails.org/
6.1 イテレーション A1:動くものを作る
railsアプリケーションの作成
問題無し。
データベースの設定
ここから早速違う。rails2.0からはMySQLではなく、SQLiteが標準となったので、こちらを使うようにする。といっても、設定は何もいらない。むしろ本に書いているデータベースの作成は不要。
アプリケーションの設定
ここで示しているconfig/database.ymlが、以下のようになる。
# rails2.0対応版 development: adapter: sqlite3 database: db/development.sqlite3 timeout: 5000
設定のテスト
rakeは同じ。SQLiteでのデータベースの確認方法は以下。
depot> sqlite3 db/developmenet.sqlite3 SQLite version 3.5.6 Enter ".help" for instructions sqlite> .q
Productsモデルとテーブルの作成
本の例でもいいが、rails2.0になってから、テーブル定義をより簡潔に書けるようになった。タイプを指定して、複数カラムを同時に作成したりもできる。テーブル定義の例。
create_table :products do |t| t.string :title, :image_url t.text :description t.timestamps end
ジェネレーターが作ったテンプレートにはtimestampsが追加されるようになったので、せっかくので使ってみる。
コントローラの作成
同じ。
管理アプリケーションの作成
Controllerでscaffoldを使用しているのだが、rails2.0になってscaffoldが大きく変わって、このままでは動かない。ここではまる人は多いようで、先人の知恵を拝借。
- Rails 2.0.2 だと scaffoldメソッドが無い - Rubyとか Illustratorとか SFとか折紙とか
- よしたんのぶろぐ scaffold ? paginate ? なんじゃそれ?
- Ruby on Rails2.0で、NoMethodError in AdminController#index
端的に言うと、rails2.0からは動的なscaffoldは外部プラグインになったので、手動でプラグインのインストールが必要。さらにscaffoldが依存するpaginateやwill_paginateも必要と。
pluginのインストールについては別エントリpluginのインストールとかを参照。
また、rails2.0からはデフォルトでCSFR対策がされるようになったそうで、その設定行わないとサンプルアプリのデータ更新で InvalidAuthenticityToken エラーが発生する。とりあえずは、無効にしておけばいいんじゃかな。コントローラの元となる ApplicationController(app/controllers/application.rb)で、protect_from_forgeryの呼び出しがあるので、そこをコメントアウトする。
class ApplicationController < ActionController::Base helper :all # include all helpers, all the time # この下をコメントアウトする #protect_from_forgery # :secret => 'dce30641d609069ec190e2dd310a6d24' end
アプリケーション全体で無効にする場合は、config/environments/test.rbに以下を追記。
Rails::Initializer.run do |config| ... config.action_controller.allow_forgery_protection = false ... end
RailsでのCSFR対策については以下を参照
- 2.0 の CSRF 対策の仕組みとか利用法とか
簡単に言うと、protect_from_forgery が書かれていると、自動的にフォーム中にhiddenのauthenticity_tokenというパラメータが作成され、POST時に正しいトークンじゃないとエラーにする、といったことらしい。scaffoldで動的に作成した場合は、このhiddenパラメータが自動的に作られないため、エラーになってしまう(のだと思う。。)
色々調べてみると、コントローラに以下のように書くと動いた、等あるが
protect_from_forgery :secret => 'hogehoge', :only => :index
動くのは当たり前で、only で index を指定してるため、indexアクション時にだけが対象になり、しかも通常indexアクションはPOSTじゃないので、結局、無効にしてるのと実質同じ。
次回は、6.3 イテレーション A2:足りない列の追加
Mac OS X (10.4/Tiger)でSQLiteを使う際の注意点
Mac OS X 10.4 には標準で SQLite がインストールされているのだが、そのままでは問題あるらしい。
http://wiki.rubyonrails.org/rails/pages/HowtoUseSQLite ここの最後の方、Q: On Mac OS X (10.4/Tiger), I’m getting an error during migrations: に書いてある。ソースからインストールしろとあるが、MacPort でSQLite3をインストールし、sqlite3-rubyを再インストールしてもうまくいった。
SQLiteのインストール # port install sqlite3 sqlite3-rubyの再インストール # gem uninstall sqlite3-ruby # gem install sqlite3-ruby