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が大きく変わって、このままでは動かない。ここではまる人は多いようで、先人の知恵を拝借。

 端的に言うと、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対策については以下を参照

 簡単に言うと、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