рубин на рельсах не делает правильных действий - PullRequest
1 голос
/ 10 ноября 2009

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

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

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

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

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

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

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

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

RoR просто редактировал people / 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"}

Редактировать 2 контроллера пробника

    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

Ответы [ 3 ]

3 голосов
/ 10 ноября 2009

Трудно сказать точно, поскольку вы опубликовали очень мало подтверждающих деталей для своего вопроса, но я предполагаю, что ваш файл маршрутов настроен так, что приоритет чего-то, совпадающего с :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, чтобы увидеть, где запрос закончится.

2 голосов
/ 10 ноября 2009

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

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

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

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

0 голосов
/ 11 ноября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...