【发布时间】:2011-07-19 20:02:54
【问题描述】:
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"}
您可能已经猜到了,在调用 collection 而不是 member 上的方法时,我丢失了“id”参数。 请注意,我知道“项目”末尾的“s”有多重要。我知道您需要在某些情况下忽略它,而在其他情况下添加它。
有人可以帮我吗? 我的错误是什么?
非常感谢您的帮助!
【问题讨论】:
标签: ruby-on-rails-3 controller routes http-post custom-routes