Rails 冠军
我用 Ruby 和 Rails 2.x 编程已经有一段时间了,虽然我当然不精通 Rails,但我仍然会说我很好地掌握了框架和工具。但是,我目前正在处理我的第一个 Rails 3 项目(目前使用 3.0.5),并且我对新的 Rails 3 路由接口越来越绝望。
当然,我一直在关注 Ryan Bates 的 RailsCasts (http://railscasts.com),特别是在这个主题上。
当然,我已经阅读了很多很多关于该主题的网站(例如RailsGuides:Rails Routing from the Outside In或The Lowdown on Routes in Rails 3等,等等……)。
我什至是那些读书的老派之一,所以我也一直在关注 The Pragmatic Programmers 的 Beta Book on Rails 3。而且,最后但并非最不重要的一点是,我确实尝试在此站点上找到合适的答案。
我想你可以说,在用我的问题纠缠你之前,我真的试图找到自己的出路。但似乎没有什么能真正解决我的问题。然而,我很确定,解决方案不会太难。几天来我一直在努力寻找解决方案,但我只是不明白我的错误是什么。
首先让我简要介绍一下我已经可以做的事情:
我对 routes.rb 中的条目预定义的标准 Rails 方法没有任何问题,例如:
resources :my_controller
我还设法让我自己的一些 GET 方法起作用,例如:
# in routes.rb
resources :some_items do
get :my_additional_method, :on => :member
end
# in a view of SomeItemController:
<%= link_to 'invoke additional method', [:my_additional_method, @some_item], :class => "some_css_class" %>
但是,以下情况让我非常头疼:
# in ItemController
def my_method
raise params.to_yaml
end
# in routes.rb
resources :items do
post :my_method, :on => :member
end
# e.g. in edit view of ItemController:
<% form_tag ( my_method_item_path(@item), {:class => :some_css_class} ) do %>
...
<% end %>
# 'rake routes' output excerpt
my_method_item POST /items/:id/my_method(.:format) {:controller =>"items", :action=>"my_method"}
# ERROR during the rendering of the view
No route matches {:action=>"my_method", :controller=>"items", :id=>#<Item id: ...>}
我尝试了上述的几十种变体。例如,以下变体没有帮助:
# variation of form_tag in view:
<% form_tag ( {:controller => "items", :action => "my_method", :id => @item }, {:class => :some_css_class} ) do %>
我唯一得到的工作 - 然而,这不是我想要的 - 如下:
# in ItemController
def my_method
raise params.to_yaml
end
# in routes.rb
resources :items do
post :my_method, :on => :collection
end
# e.g. in edit view of ItemController:
<% form_tag ( my_method_items_path(@item), {:class => :some_css_class} ) do %>
...
<% end %>
# 'rake routes' output excerpt
my_method_items POST /items/my_method(.:format) {:controller =>"items", :action=>"my_method"}
正如您可能已经猜到的那样,在调用集合而不是member上的方法时,我丢失了“id”参数。请注意,我知道“项目”末尾的“s”有多重要。我知道您需要在某些情况下将其排除在外,并在其他情况下将其添加。
有谁可以帮我离开这里吗?我的错误是什么?
非常感谢你的帮助!