рубин на рельсах не делает правильных действий

Я пытаюсь редактировать форму, маршрут для контроллера / ID / действие для редактирования, например,

люди / 124321 / редактировать

Я пытаюсь заставить эту форму отправлять действие обновления, используя этот код:

<% form_for :probe, @probe, :action => "update" do |f| %>
   ...
   ...
   ...
   <%= submit_tag 'Submit' %>
<% end %>

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

Неизвестное Действие. Ни одно действие не ответило на (id).

редактировать

Единственное, что в моих маршрутах указано для зондов, это map.resources: зонды

RoR только что сделал людей / 124321 / редактировать сам, когда я сгенерировал контроллер.

Рейк-маршруты показывают это

probes       GET /probes(.:format) {:controller=>"probes", :action=>"index"}
             POST   /probes(.:format) {:controller=>"probes", :action=>"create"}
new_probe    GET    /probes/new(.:format) {:controller=>"probes", :action=>"new"}
edit_probe   GET    /probes/:id/edit(.:format) {:controller=>"probes",action=>"edit"}
             GET    /probes/:id(.:format) {:controller=>"probes", :action=>"show"}
             PUT    /probes/:id(.:format) {:controller=>"probes", :action=>"update"}
             DELETE /probes/:id(.:format) {:controller=>"probes", :action=>"destroy"}

Edit 2 Probe Controller

    def edit
     @probe = Probe.find(params[:id])
    end

    def update
    @probe = Probe.find(params[:id])
    debugger
    if @probe.update_attributes(params[:probe])
      flash[:notice] = "Successfully updated probe."
      redirect_to probes_path
    else
      render :action => 'edit'
    end
  end
10.11.2009 20:38:23
Можете ли вы опубликовать именно то, что ваш маршрут?
Matt Grande 10.11.2009 20:42:24
Это должен быть контроллер / действие / идентификатор ... верно? Или я что-то упустил?
Andrew Flanagan 10.11.2009 20:42:53
Иногда просмотр сгенерированного HTML-кода может помочь определить, связана ли проблема с контроллером или представлением. HTML должен явно иметь / people / <some id> / edit.
Kathy Van Stone 10.11.2009 20:57:31
3 ОТВЕТА
РЕШЕНИЕ

Трудно сказать точно, так как вы опубликовали очень мало подтверждающих деталей для своего вопроса, но я предполагаю, что ваш файл маршрутов настроен так, что приоритет чего-то совпадает с :controller/:action/:idтем, к которому вы стремитесь :controller/:id/:action.

Маршруты оцениваются сверху вниз, выигрывает первый матч.

Я также повторю ответ Джона. Вам не нужно указывать :action => 'update', и на самом деле в эти дни я обычно извлекаю форму из обоих new.html.erbи edit.html.erbв частичные _form.html.erb. form_forвыяснит, является ли объект новой записью и выполнит ли POST действие createили updateдействие, в зависимости от ситуации.

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

rake routesтакже хороший инструмент для отладки. Проверьте исходный код страницы, чтобы увидеть, что Rails использовал для actionатрибута формы , затем просмотрите выходные данные, rake routesчтобы увидеть, где запрос закончится.

3
10.11.2009 21:00:14
Единственное, что в моих маршрутах указано для зондов, это map.resources: зонды RoR только что произвел редактирование people / 124321 /, когда я сгенерировал контроллер (я предполагаю)
Ryan 10.11.2009 20:53:13
Это весь «рейк-маршрут»? Существуют ли маршруты, которые не используют ресурсы, но вместо этого используется более старая форма: controller /: action /: id? Кроме того, идентификатор вашего объекта Probe выглядит иначе, чем ваш комментарий в ответе Джона. Там есть встроенные символы "+". Rails, вероятно, будет интерпретировать их как пространства в кодировке URL, что может запутать маршрутизатор. Наконец, какую ошибку вы получаете, когда переключаетесь на синтаксис 'form_for', который мы с Джоном предложили?
Steve Madsen 11.11.2009 03:34:53
Я нашел проблему, забыл обновить это. Это было на самом деле связано с соглашением об именах, которое путалось в рельсах. Это все испортило, о чем я подумала (а не только об этой проблеме), и, выследив некоторое время, я смогла использовать обычную форму, предложенную Джоном. Вы оба правильно меня поняли, спасибо. Я очень ценю это.
Ryan 14.11.2009 03:20:01

Если вы используете ресурсы RESTful, вы должны просто сделать это:

<% form_for(@probe) do |f| %>
  .
  .
  .
  <%= f.submit 'Submit' %>
<% end %>

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

Также обратите внимание на использование f.submitв моем примере. В *_tagпомощниках идут вместе, так что вы не обычно видеть form_forпомощник с микросхемой submit_tag.

2
10.11.2009 20:50:07
Когда я делаю это, я получаю сообщение об ошибке в строке form_for. Ошибка произошла при оценке nil.to_sym
Ryan 10.11.2009 20:52:40
Это, вероятно, потому, что ваша переменная экземпляра @probe равна nil в действии (методе) редактирования вашего контроллера. Действие редактирования отображает форму, подходящую для редактирования модели. Затем форма отправляется в действие обновления.
John Topley 10.11.2009 20:55:20
Какова ваша ценность для @probe?
Kathy Van Stone 10.11.2009 20:56:18
От ruby ​​отладчика в действии редактирования .......... irb (# <ProbesController: 0x62d8f74>): 001: 0> @probe => # <Идентификатор зонда: "PoXmvhvk + ORIH + p7", имя: "gragrag", user_id: 1, онлайн: nil, cre ated_at: "2009-11-10 19:16:12", updated_at: "2009-11-10 19:16:12", статус: 3, st reet: "ragragra", город: "ragragra", страна: ноль, zip: "", штат: "KS", имя контакта: "", номер контакта: "", удалено: 0>
Ryan 10.11.2009 20:59:57

«Неизвестное действие. Ни одно действие не ответило (id)». звучит как проблема маршрутизации.

Вы удалили или закомментировали маршруты по умолчанию в вашем файле rout.rb?

map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'

Если выполняются маршруты по умолчанию, это может поменять идентификатор действия?

0
10.11.2009 22:11:37