Jun's Blog

Output, activities, memo and etc.

RSpec on Railsのコントローラー自動生成がうまくいかない

各バージョンは以下の通り。
Rspec on Railsのバージョンは plugin のバージョン表示の仕方がわからなかったので、History.rdocファイルをみた。

$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-solaris2]

$ rails -v
Rails 2.3.2

$ head vendor/plugins/rspec-rails/History.rdoc 
=== Version 1.2.8 (in git)
...

うまくいかない。

$ ruby script/generate rspec_controller realestates show
undefined local variable or method `controller_class_path' for #<RspecControllerGenerator:0x99ab600>

うまくいかない。

$ ruby script/generate rspec_controller 'realestates/image' index show
undefined local variable or method `controller_class_path' for #<RspecControllerGenerator:0x9966938>

この辺、読んだけど不明。バグ?

$ vi vendor/plugins/rspec-rails/generators/rspec_controller/rspec_controller_generator.rb
$ cd xxx
$ vi rails-2.3.2/lib/rails_generator/generators/components/controller/controller_generator.rb

controllerの自動生成はうまくいく。

$ ruby script/generate controller 'realestates/image' index show
      create  app/controllers/realestates
      create  app/helpers/realestates
      create  app/views/realestates/image
      create  test/functional/realestates
      create  test/unit/helpers/realestates
      create  app/controllers/realestates/image_controller.rb
      create  test/functional/realestates/image_controller_test.rb
      create  app/helpers/realestates/image_helper.rb
      create  test/unit/helpers/realestates/image_helper_test.rb
      create  app/views/realestates/image/index.html.erb
      create  app/views/realestates/image/show.html.erb

今度、もう少し調べてみよう。

Ruby on Rails: map.resourcesで、namespaceをもったコントローラーを割り当てる。

以下を参考にさせて頂きました。
http://d.hatena.ne.jp/zariganitosh/20080203/1202091772

やりたいのは、こういうパスを表示すること。
/realestates/1/images/
/realestates/1/images/1

まずは対応するコントローラーを作成

$ script/generate controller 'realestates/image' index show

routes.rb を修正

方法1: has_manyを追加。

→うまくいかない。
http://xxxx/realestates/1/images/1/
を表示しようとすると ImageContolller#show にアクセスしている。
ImagesController のインスタンスがないと言われる。
Realestates::ImagesController に紐づけたい。

$ vi config/routes.rb
...
  map.resources :realestates, :has_many => :images
...

方法2: do 記法で対応。

→うまくいかない。方法1と同じ結果。

$ vi config/routes.rb
...
  map.resources :realestates
  map.resources :realestates do |realestates|
       realestates.resources :images
  end
...

方法3: map.namespaceをmap.resourcesの後ろに設置

→うまくいかない。
 これは /realesatates/images/1 は表示できる。
 Realesates:ImagesContollerに紐づけるやり方。
 /realestates/1/images/1 は表示できない。

$ vi config/routes.rb
...
  map.namespace :realestates do |realestates|
    realestates.resources :images
  end
  map.resources :realestates
...

方法4: Realestates::ImagesControllerをあきらめ、RealestatesImagesControllerに変更

→うまくいった!
コントローラーを作りなおして、map.resources で、コントローラーを明示的に指定した。
 /realestates/1/images/1 は表示できる。

$ script/destroy controller 'realestates/images' index show
$ script/generate controller 'realestates_images' index show
...
  map.resources :realestates
  map.resources :realestates do |realestates|
    realestates.resources :images, :controller => :realestates_images
  end
...

下記URLとRailsのソースは参考になりました。

http://api.rubyonrails.org/classes/ActionController/Resources.html
http://api.rubyonrails.org/classes/ActionController/Routing.html

値の取得

/realestates/1/images/1 からそれぞれの数字は、/realesates/:realestate_id/images/:id なので、params[:realestate_id], params[:id]で取得できる。

課題

/realestates/1/images/1に、Realesatates::ImagesControllerを割り当てたい。Railsの思想的におかしいことなのだろうか。

以下の本を読んで勉強したいと思う。