Rails 3.0.10, клиентские маршруты, тег post и form_for - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть в моих маршрутах:

resources :events do
  collection do
    post 'moderate'
  end
end

Маршруты граблей говорят мне:

moderate_events POST /events/moderate(.:format) {:controller=>"events", :action=>"moderate"}

У меня есть контроллер «администрирования», который просто перечисляет события, которые необходимо модерировать:

@modevents = Event.where('moderated <> 1')

Пока все хорошо, все события, которые не были модерированы, могут отображаться в виде:

<%- @modevents.each do |me| -%>
  Display Stuff here
<%- end -%>

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

<%= form_for me, :url => moderate_events_path do |f| %>
  <%= f.submit %>
<% end %>

html возвращается:

<form accept-charset="UTF-8" action="/events/moderate" class="edit_event" id="edit_event_1" method="post">
  <div style="margin:0;padding:0;display:inline">
  <input name="utf8" type="hidden" value="&#x2713;" />
  <input name="_method" type="hidden" value="put" />

Когда я нажимаю кнопку «Отправить», я получаю следующую ошибку:

Couldn't find Event with ID=moderate

Решение очень простое, в маршрутах измените "post" на "put":

resources :events do
  collection do
    put 'moderate'
  end
end

А теперь работает как надо. Обновления, даже пользовательские, являются «положенными» функциями.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

Вы также можете использовать POST, указав:

<%= form_for me, :url => moderate_events_path, :method => :post do |f| %>

, но, как уже было сказано, необходимо различать обновление и создание.Стандарт в рельсах: update == put и create == post.

0 голосов
/ 29 ноября 2011

Ответ на самом деле в тексте выше внизу, но, возможно, не очевиден. Если вы обновляете материал, вы должны использовать «put», а не post.

...