Чемпионы Rails
Я довольно давно программирую на Ruby и Rails 2.x, и хотя я, конечно, не очень разбираюсь в Rails, я все же скажу, что у меня есть хорошее представление орамки и инструменты.Однако в настоящее время я работаю над своим первым проектом Rails 3 (в настоящее время использующим 3.0.5), и я все больше отчаялся от нового интерфейса маршрутизации Rails 3.
Конечно, я следил за RailsCasts Райана Бейтса(http://railscasts.com) в целом и по теме в частности.
Конечно, я читал много, много веб-сайтов по этой теме (например, RailsGuides: маршрутизация Rails извне * или Lowdown на маршрутах в Rails 3 и т. Д., И т. Д.).
Я даже один из тех старомодных парней, которые читают книги, поэтому я также следил за Бета-книгой по Rails 3 от TheПрагматичные программисты. И, наконец, что не менее важно, я попытался найти подходящий ответ на этом сайте.
Полагаю, вы могли бы сказать, что я действительно пытался найти способ обойти вас, прежде чем приставать к вам со своим вопросом.Но, кажется, ничто не может действительно покрыть мою проблему. Тем не менее, я уверен, что решение не может быть слишком сложным. Я пытался найти решение в течение нескольких дней, я просто не понимаю, чтомоя ошибка заключается в следующем.
Позвольте мне сначала дать краткое краткое изложение того, что я уже могу сделать:
У меня нет проблем со стандартными методами Rails, предопределенными записями в rout.rb, такими как:
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"}
Как вы уже, наверное, догадались, я теряю параметр "id" при вызове метода для collection вместо member .Обратите внимание, что я знаю, насколько важны буквы "s" в конце "элемента".Я знаю, что вам нужно оставить это в некоторых ситуациях и добавить в других.
Может кто-нибудь помочь мне здесь?В чем моя ошибка?
Большое спасибо за помощь!