Rails форма работает на создание, а не обновление - PullRequest
0 голосов
/ 05 июня 2011

У меня есть форма города, которая работает для первоначального создания города, но когда я пытаюсь обновить город, я получаю ошибку маршрутизации.

Мои маршруты.рб:

 map.resources :states do |state|
 state.resources :cities
end

Форма:

  <% simple_form_for @city, :url => state_cities_path do |f| %>
  <%= f.input :name %>
  <%= f.input :active %>
  <%= f.submit "Save City" %>
  <% end %>

Контроллер:

  if @city.update_attributes(params[:city])
    format.html { redirect_to state_cities_path(:state_id => @city.state_id) }
    format.xml  { head :ok }

Ошибка:

No route matches "/states/1/cities"

Теперь, если я щелкну в адресной строке и нажму клавишу ввода, я попаду прямо к маршруту, который, по его словам, не существует. Действие создания идентично redirect_to.

Идеи? Это проблема POST против PUT?

1 Ответ

0 голосов
/ 05 июня 2011

проблема в этой строке

 simple_form_for @city, :url => state_cities_path

вы не позволяете создателю формы создать правильный маршрут, по которому вы его вводите. Построитель форм создает правильный маршрут для экземпляра, который вы передаете, обнаруживая, является ли новая запись, затем устанавливает правильный путь в атрибуте действия формы html и устанавливает правильный метод http.

Кажется, вас смутило то, что вы используете вложенные маршруты и пытаетесь передать путь / URL, поэтому построитель форм больше не обнаруживает ничего и позволяет вам устанавливать все, так как формы публикуются по умолчанию, и вы передача URL-адреса действию создания, которое никогда не соответствует действию обновления. Вы сопоставляете только действие create, потому что для действия обновления требуется такой идентификатор

PUT /states/:state_id/cities/:id

что есть то, что нужно для соответствия маршруту обновления, но вы не передаете ни идентификатор, ни метод http.

Решение

Позвольте построителю форм создать путь, это делается с помощью вложенных маршрутов, передавая массив с родительским экземпляром и дочерним экземпляром, который вы хотите использовать конструктору форм.

simple_form_for [@state,@city] do |f|

не забудьте поместить значение в @state, иначе это приведет к ошибке nil.

теперь построитель форм должен правильно построить правильный путь для действия создания и обновления.

кстати, вы также можете перенаправить в массив, подобный этому

redirect_to [@state,@city]

отправит пользователя на шоу-шоу города.

...