タグ: ruby

  • Rails controllerの複数形と単数形

    Ruby on Rails の勉強を始めたころ、なぜここは単数形で名前をつけるのか、なぜここは複数形にするのか、といったことでいちいち悩みました。最近、RESTful routing の勉強をしていて、controller の名前を単数にしてしまった場合の例が見つからず、「名前つけ直そうか」と焦ったのですが。。

    以下、Rails 2.2.2 で確認しました。

    config/routes.rb で

    map.resources :channels
    

    と書くと

    $ rake routes
    channels GET    /channels                        {:controller=>"channels", :action=>"index"}
    formatted_channels GET    /channels.:format                {:controller=>"channels", :action=>"index"}
    POST   /channels                        {:controller=>"channels", :action=>"create"}
    POST   /channels.:format                {:controller=>"channels", :action=>"create"}
    new_channel GET    /channels/new                    {:controller=>"channels", :action=>"new"}
    formatted_new_channel GET    /channels/new.:format            {:controller=>"channels", :action=>"new"}
    edit_channel GET    /channels/:id/edit               {:controller=>"channels", :action=>"edit"}
    formatted_edit_channel GET    /channels/:id/edit.:format       {:controller=>"channels", :action=>"edit"}
    channel GET    /channels/:id                    {:controller=>"channels", :action=>"show"}
    formatted_channel GET    /channels/:id.:format            {:controller=>"channels", :action=>"show"}
    PUT    /channels/:id                    {:controller=>"channels", :action=>"update"}
    PUT    /channels/:id.:format            {:controller=>"channels", :action=>"update"}
    DELETE /channels/:id                    {:controller=>"channels", :action=>"destroy"}
    DELETE /channels/:id.:format            {:controller=>"channels", :action=>"destroy"}
    

    となり、view で <%= link_to “index”, channels_path %> などと書けます。

    たまたま controller を channel のように単数形にしてしまうとどうなるのか、試してみました。

    map.resources :channel
    
    $ rake routes
    channel_index GET    /channel                         {:controller=>"channel", :action=>"index"}
    formatted_channel_index GET    /channel.:format                 {:controller=>"channel", :action=>"index"}
    POST   /channel                         {:controller=>"channel", :action=>"create"}
    POST   /channel.:format                 {:controller=>"channel", :action=>"create"}
    new_channel GET    /channel/new                     {:controller=>"channel", :action=>"new"}
    formatted_new_channel GET    /channel/new.:format             {:controller=>"channel", :action=>"new"}
    edit_channel GET    /channel/:id/edit                {:controller=>"channel", :action=>"edit"}
    formatted_edit_channel GET    /channel/:id/edit.:format        {:controller=>"channel", :action=>"edit"}
    channel GET    /channel/:id                     {:controller=>"channel", :action=>"show"}
    formatted_channel GET    /channel/:id.:format             {:controller=>"channel", :action=>"show"}
    PUT    /channel/:id                     {:controller=>"channel", :action=>"update"}
    PUT    /channel/:id.:format             {:controller=>"channel", :action=>"update"}
    DELETE /channel/:id                     {:controller=>"channel", :action=>"destroy"}
    DELETE /channel/:id.:format             {:controller=>"channel", :action=>"destroy"}
    

    のようになりました。

    link_to ‘xxx’, channels_path が channel_index_path のようになり、多少名前が冗長にはなりますが、無事に RESTful routing に移行できそうです。

    • 2009-07-22 追記:rails 2.x の scaffold が生成するのは「複数形の名前が付けられたコントローラ」なので、scaffold 流に揃えたほうがよさそうですね。
  • Ubuntu 8.04 (vmware) + rails 2.3.2

    Ruby on Rails 2.3.2 を使える環境を作る手順。何度も同じ失敗をしたので、備忘録として書きます。

    使用したのは Ubuntu 8.04 日本語リミックスの VMware 仮想マシン(VMware Player 2.5.1 on Windows XP)。

    安易に 8.10 にアップグレードしたら open-vm-tools がおかしくなり、eth0 を認識しなくなったので、8.04 のまま使うことにしました。HGFS は使えないのですが、ホストOS(Windows XP)とのあいだでコピー&ペーストができるので便利です。

    apt-get でインストールされる gem はバージョンが古いので、このままでは後の作業がうまく行きません。

    /var/lib/gems/1.8/ にインストールされるのは古い gem の挙動、/usr/lib/ruby/gems/1.8/ にインストールされるのが新しい(望ましい?)gem の挙動のようです。

    • 2009-08-12 追記:Debian パッケージの gem をそのまま使うと /var/lib/gems 以下にインストールされる、ということらしいです。Ubuntu 9.04 の /usr/bin/gem1.8 (gem 1.3.1) においても /var/lib/gems に実行ファイルが生成されることを確認しました。
    $ sudo apt-get install ruby rubygems
    $ gem -v
    0.9.4
    $ which gem
    /usr/bin/gem
    
    • 追記 (2009-05-20) Ubuntu 9.04 の rubygems1.8 はバージョン 1.3.1 でした。

    手作業で gem 1.3.1 を入れる。

    $ sudo gem install rubygems-update-1.3.1.gem
    $ sudo /var/lib/gems/1.8/bin/update_rubygems
    ...
    RubyGems installed the following executables:
    /usr/bin/gem1.8
    If `gem` was installed by a previous RubyGems installation, you may need
    to remove it by hand.
    

    古い /usr/bin/gem と新しい /usr/bin/gem1.8 が共存しているので、手作業で対応。

    $ gem -v
    /usr/bin/gem:10:Warning: Gem::manage_gems is deprecated and will be removed
    on or after March 2009.
    /usr/bin/gem:23: uninitialized constant Gem::GemRunner (NameError)
    $ gem1.8 -v
    1.3.1
    $ pushd /usr/bin; sudo mv gem gem.org ; sudo ln -s gem1.8 gem; popd
    $ gem -v
    1.3.1
    

    gem 1.3.1 を使って rails を入れる。

    $ sudo gem install rails
    Successfully installed rake-0.8.4
    Successfully installed activesupport-2.3.2
    Successfully installed activerecord-2.3.2
    Successfully installed actionpack-2.3.2
    Successfully installed actionmailer-2.3.2
    Successfully installed activeresource-2.3.2
    Successfully installed rails-2.3.2
    7 gems installed
    ...
    $ rails -v
    Rails 2.3.2
    

    アプリケーション hoge を作って、sqlite3 で rake test を通す。

    $ rails hoge
    $ cd hoge
    $ rake test
    rake aborted!
    no such file to load -- sqlite3
    

    sqlite3 環境が足りないから rake test が通らない。下記サイトを参考に対処。

    $ sudo apt-get install ruby1.8-dev swig libsqlite3-dev
    $ sudo gem install sqlite3-ruby
    

    migrate して test する。

    $ rake db:migrate
    (in /home/nishi/hoge)
    $ rake test
    (in /home/nishi/hoge)
    /usr/bin/ruby1.8 -I"/home/nishi/hoge/lib" -I"/home/nishi/hoge/test"
    "/usr/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader.rb"
    /usr/bin/ruby1.8 -I"/home/nishi/hoge/lib" -I"/home/nishi/hoge/test"
    "/usr/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader.rb"
    /usr/bin/ruby1.8 -I"/home/nishi/hoge/lib" -I"/home/nishi/hoge/test"
    "/usr/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake/rake_test_loader.rb"
    

    test が通ったので、server を動かしてブラウザから確認する。

    $ script/server
    
    Welcome aboard
    You're riding Ruby on Rails!
    About your application's environment
    Ruby version	        1.8.6 (i486-linux)
    RubyGems version	1.3.1
    Rack version	        1.0 bundled
    Rails version	        2.3.2
    Active Record version	2.3.2
    Action Pack version	2.3.2
    Active Resource version	2.3.2
    Action Mailer version	2.3.2
    Active Support version  2.3.2
    Application root	/home/nishi/hoge
    Environment	        development
    Database adapter	sqlite3
    Database schema version	0
    
  • リリースノートとチュートリアル

    sourceforge.jp の galatea プロジェクトの wiki サイトに、3月に配付される予定の Galatea Toolkit リリースノートとチュートリアルの草稿を公開しています。

    チュートリアルでは Ruby on Rails を使う具体的な例を掲載しました。