Проблема маршрутизации с вызовом нового метода без идентификатора - PullRequest
2 голосов
/ 31 марта 2010

Я пытаюсь собрать form_tag, который редактирует несколько объектов Shift. У меня правильно построена форма, и она передает правильные параметры. Я проверил, что параметры работают с корректным обновлением объектов в консоли. Однако, когда я нажимаю кнопку отправки, я получаю сообщение об ошибке:

ActiveRecord::RecordNotFound in ShiftsController#update_individual
Couldn't find Shift without an ID

Мой маршрут для вызываемого контроллера выглядит примерно так:

map.resources :shifts, :collection => { :update_individual => :put }

Метод в ShiftsController таков:

def update_individual
  Shift.update(params[:shifts].keys, params[:shifts].values)
  flash[:notice] = "Schedule saved"
end

Соответствующие части формы:

<% form_tag( update_individual_shifts_path ) do %> 
  ... (fields for...)
  <%= submit_tag "Save" %>  
<% end %>

Почему это не работает? Если я перехожу по URL: «http://localhost:3000/shifts/update_individual/5" (или любое число, соответствующее существующему сдвигу), я получаю правильную ошибку о том, что параметры не установлены, но когда я передаю параметры без какого-либо идентификатора, ошибки.

Как мне заставить его перестать искать идентификатор в конце URL?

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Я думаю, что вам нужно указать помощнику тега формы, что вы хотите использовать PUT вместо POST

<% form_tag( update_individual_shifts_path, :method => :put) do %>
  ... fields ....
  <%= submit_tag "Save" %>
<% end %>
0 голосов
/ 01 апреля 2010

Удивительно, но оказалось, что мне удалось это исправить комбинацией переименования метода и передачи фиктивной переменной. Изменения были в строках:

form.html.erb:

<% form_tag( poop_individual_shifts_path ) do %>

routes.rb:

map.poop_individual_shifts "poop_shifts", :controller => 'shifts', :action => "poop_individual", :method => "put", :id => 4
map.resources :shifts 

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

shifts_controller.rb:

def poop_individual
...