Jun's Blog

Output, activities, memo and etc.

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の思想的におかしいことなのだろうか。

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