Базовая вложенная маршрутизация в Rails 3

ПРИМЕЧАНИЕ. Я прочитал статью Routing From the Inside Out AND the Engine Yard, посвященную маршрутизации.

Я создаю лигу фэнтези-спорта, у меня есть модель лиги, которая поддерживает семь основных операций отдыха, и все они работают нормально.

Я добавил следующие мои маршруты.rb

  resources :leagues do
    member do
      get :invite
      post :sendem
    end

Позже в файле у меня есть ресурсы :leagues для основных действий.

а когда разгребаю маршруты вижу:

invite_league GET    /leagues/:id/invite(.:format)      {:action=>"invite", :controller=>"leagues"}
sendem_league POST   /leagues/:id/sendem(.:format)      {:action=>"sendem", :controller=>"leagues"}

чего я и ожидал. У меня есть две функции в контроллере League: «invite», которая создает форму для сбора адресов электронной почты, и «sendem», которая вызывает почтовую программу для фактической отправки приглашений.

Получение для /league/:id/invite действительно создает форму. Тег формы, который я использую, выглядит так:

<%= form_tag(sendem_league_path, :method => "post") do %>

и все же отображаемый HTML выглядит так:

<form accept-charset="UTF-8" action="/leagues/1" class="edit_league" id="edit_league_1" method="post">

И, следовательно, при отправке генерируется PUT, который совершенно неверен. (Он должен быть отправлен в функцию sendem.) Мое изменение в файле маршрутов отображается над общей строкой ресурсов :leagues, поэтому оно должно иметь более высокий приоритет.

Я уверен, что есть что-то очень простое, что я пропустил, но у меня нет идей. (И волосы).


person ScottyDont    schedule 14.06.2012    source источник
comment
Попробуйте :method =› :post и удалите скобки.   -  person MurifoX    schedule 14.06.2012
comment
Никакой разницы MurifoX :(   -  person ScottyDont    schedule 15.06.2012
comment
Почему нет чего-то вроде этого form_tag(sendem_league_path(league.id)).... я имею в виду, что для вашего маршрута требуется один параметр   -  person vladdruzh    schedule 16.06.2012


Ответы (2)


Вы не должны использовать form_tag для управления ресурсами. Вы должны использовать form_for. Ознакомьтесь с помощником по форме — раздел 2 "Работа с объектами модели". Он заботится о выводе, использовать ли POST или PUT для объекта модели. Например, если ваш объект модели новый, он будет использовать публикацию на URL-адресе «ресурсов». если это уже существующий объект базы данных, он будет использовать PUT для URL-адреса этого «ресурса».

person Salil    schedule 17.06.2012
comment
У меня уже есть CRUD-функции для этого ресурса — это дополнительные функции, которые в лучшем случае считывают атрибуты модели (ничего не пишется, не создается и не обновляется). Я также пробовал перенос этих функций в отдельный контроллер, но и этот подход не сработал. - person ScottyDont; 17.06.2012

ARGH какой-то код ошибки обработки формы вверху (форма для @league) создал вторую форму на странице для редактирования.... (для краткости опущены фрагменты кода выше). Исходный код, кажется, работает, как и ожидалось, с этим другим кодом, закомментированным. Спасибо vladdruzh за то, что убедил меня, что я на правильном пути, и Salil за то, что заставил меня задуматься о том, чтобы прочитать отрендеренный HTML сверху вниз.

person ScottyDont    schedule 17.06.2012
comment
Ответ на этот вопрос? Если это так, опубликуйте решение (код) и примите ответ. - person Noah Clark; 17.06.2012