Ошибка «Нет совпадений маршрутов» в Rails 3 при вызове метода собственного контроллера из представления (POST) - PullRequest
2 голосов
/ 21 марта 2011

Чемпионы 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" в конце "элемента".Я знаю, что вам нужно оставить это в некоторых ситуациях и добавить в других.

Может кто-нибудь помочь мне здесь?В чем моя ошибка?

Большое спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 28 марта 2011

Перейдите по этому URL, чтобы узнать о добавлении More RESTful Actions к контроллеру "resources" d:

http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

resources :photos do
  member do
    get 'preview'
  end
end

Чтобы добавить следующий пример метода route:

/photos/1/preview 

Это вызовет метод предварительного просмотра контроллера фотографий с идентификатором 1

0 голосов
/ 21 марта 2011
<% form_tag (my_method_item_path(@item), :class => :some_css_class, :method => :post ) do %>
    ...
<% end %>
...