Например, вы можете поместить это в функцию javascript, которая вызывается при возникновении ошибок проверки:

я есть 2 действия - Изменить и Обновить. Форма в Edit передает значения в действие Update. При сбое при сохранении модели я отрисовываю шаблон редактирования, где пользователь видит ошибки, а поля заполняются тем, что он заполнил ранее. Там есть огромное, но для меня - в панели URL в браузере пользователя есть / user / update, даже когда (и потому что) яоказываемых редактировать шаблон Могу ли я как-то изменить это с передачей некоторых параметров для рендеринга метода в действии обновления? Я не хочу, чтобы пользователь видел, что есть какое-либо (обновление) действие, кроме редактирования. Является ли это возможным?

Ответы на вопрос(5)

В твои маршруты.рб

resources :users
match 'users/:id/edit' => 'users#update', :via => :put, :as => :put_user

По вашему мнению (например, edit.html.erb)

<%= form_for @user, :url => put_user_path do |f| %>
  ...
<%  end %>

В вашем контроллере (например, users_controller.rb)

def update
  @user = User.find(params[:id])
  if @user.update_attributes(params[:user])
    ...
  else
    render 'edit'
  end
end
 Charles Zhang29 янв. 2014 г., 01:18
Это сработало хорошо. Благодарю.
Решение Вопроса

1) Перенаправьте из действия обновления обратно в действие редактирования, а не просто визуализируйте шаблон, и передайте сообщения об ошибках и атрибуты, которые вы хотите использовать для заполнения редактируемого объекта. Это приведет к тому, что URL будет / user / edit.

def update
  @user = User.find(params[:id])
  if @user.update_attributes params[:user]
    ...
  else
    redirect_to edit_user_path(@user, :messages => @user.errors)
  end
end

2) Опубликовать в действии редактирования вместо действия обновления и полностью удалить действие обновления. Вы можете использовать request.post? в вашем действии редактирования, чтобы проверить, является ли запрос сообщением или запросом на получение, а затем выполнить действия по обновлению и редактированию, используя то же определение функции.

def edit
  @user = User.find(params[:id])
  if request.post?
    @user.update_attributes params[:user]
    ...
  else
    ...
  end
end

ПРИМЕЧАНИЕ: Имейте в виду, что вы никогда не сможете скрыть действие POST от клиента, потому что они всегда могут просмотреть ваш исходный код и увидеть действие, которое вы публикуете в своей форме.

 Cameron27 июн. 2016 г., 14:29
При выполнении варианта 1, я в конечном итоге с URL-адресом, какarticles/1/edit?messages=%23<ActiveModel%3A%3AErrors%3A0x007f81b14c5d08> и ошибки не отображаются.

основанная на ответе К.Л. Чанга

resources :jobs, except: [:update] do
    member do
        patch 'edit', action: :update, :as => :update_edit
    end
end

Это создает все стандартные маршруты отдыха, кроме стандартного маршрута обновления. (если вы не хотите все действия, то вы можете использоватьonly: [<your routes not including :update>]

Кроме того, он генерирует

update_edit_job PATCH  /jobs/:id/edit(.:format) 

Теперь вы просто обновите форму, чтобы указать путь

<%= form_for @job, :url => update_edit_job_path do |f| %>
  ...
<%  end %>

поэтому вместо отправки в / update через патч он переходит в / jobs // edit через патч, и это касается вашего действия по обновлению

теперь, если есть ошибка, вы можете отредактировать редактирование, и все ошибки будут видны - но пользователь не заметит, что URL-адрес отличается от URL-адреса редактирования (потому что отличается только метод)

def update
  @job = Job.find(params[:id])
  if @job.update_attributes(user_params)
    #redirect somewhere???
  else
    render 'edit'
  end
end

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

Во-первых, у маршрутов идоматических рельсов нет действия. Вы выполняете обновление, отправляя запрос PATCH или PUT наthings/:id, Исключение составляютnew а такжеedit так как эти действия используются для визуализации форм.

           Prefix Verb   URI Pattern                                                                              Controller#Action
           things GET    /things(.:format)                                                                        things#index
                  POST   /things(.:format)                                                                        things#create
        new_thing GET    /things/new(.:format)                                                                    things#new
       edit_thing GET    /things/:id/edit(.:format)                                                               things#edit
            thing GET    /things/:id(.:format)                                                                    things#show
                  PATCH  /things/:id(.:format)                                                                    things#update
                  PUT    /things/:id(.:format)                                                                    things#update
                  DELETE /things/:id(.:format)                                                                    things#destroy

Действие редактирования (GET / things /: id / edit) отображает форму для редактирования ресурса. Это идемпотентное действие, поскольку оно должно возвращать тот же результат и не изменять ресурс.

Действие обновления (PATCH | PUT / things /: id) отображает результат выполнения неидемпотентного преобразования для ресурса.

Следует также отметить, что рендеринг в Rails не имеет ничего общего с редиректом. Что является распространенным заблуждением.

render :edit

На самом деле это просто сокращение для:

render "things/edit"

Он не вызывает действие редактирования - они просто разделяют представление, но концептуально это совершенно разные действия.

Перезагрузка этой страницы, конечно, не будет отображать тот же результат, что и запрос GET для/things/1 - не PATCH / PUT. Помните, что запросы GET всегда должны быть идемпотентными.

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

https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method

Например, вы можете поместить это в функцию javascript, которая вызывается при возникновении ошибок проверки:

  var url = document.referrer;
  window.history.pushState(null, null, url);

Ваш ответ на вопрос