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の思想的におかしいことなのだろうか。
以下の本を読んで勉強したいと思う。