What have you found for these years?

2008-09-04

又踩到 rails 地雷了..

小心小心,以下會有奇怪的問題,看半天完全不懂為什麼。

map.resources :tags, :collection => {:edit => :get}


東翻西找,南試北踹,終於放棄,耐著性子翻 source code, 總算抓到兇手:

actionpack-2.1.0/lib/action_controller/resources.rb: 557

require_id = !resource.kind_of?(SingletonResource)


我的 tags 是 resource"s", 所以不是 SingletonResource,
這邊 require_id 就會是 true. 這還不打緊,繼續往下看:

564 行:

else
default_options.merge(
add_conditions_for(resource.conditions, method)).
merge(resource.requirements)


明明就算有 require_id 也不會怎麼樣啊,究竟為何產生的 routes 需要 id??

formatted_edit_tags GET
/tags/edit.:format
{:action=>"edit", :controller=>"tags", :id=>/[^\/.?]+/}


那個 id => 到底是怎麼生出來的??亂餵他 id 可還過不了,會死在啥 extra_key.
繼續往上看,發現:

when "show", "edit";
default_options.merge(
add_conditions_for(resource.conditions, method ||
:get)).merge(resource.requirements(require_id))


非常好!!原來是撞名了 :o
千萬記住 :member => 和 :collection => 不能取跟 rails 一樣的名字,
不然大概又會撞名然後就出事吧...

我以為 routes 應該要可以 override 才對。把 edit 改名為 edit2 後,
運作良好... 好吧,我想想看有什麼比較好的名字。edit_massively 嗎?

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0