Tengo 2 acciones: Editar y actualizar. El formulario en Editar envía los valores a Acción de actualización. Cuando se produce un error al guardar un modelo, edito la teplate de edición, donde el usuario ve errores y los campos se llenan previamente con lo que rellenó. Hay un gran pero para mí: en el panel de URL del navegador del usuario hay/usuario/actualización, incluso cuando (y porque) I prestados plantilla de edición. ¿Puedo de alguna manera cambiar eso con pasar algunos parámetros para representar el método en la acción de actualización? No quiero que el usuario vea que hay alguna acción (de actualización) aparte de editar. ¿Es posible?¿Renderizar plantilla y cambiar cadena url en el navegador?
Respuesta
Hay dos maneras de evitar esto:
1) redirección desde la acción de actualización de nuevo a la acción de edición, en lugar de hacer que la plantilla, y pasar los mensajes de error y los atributos que desea utilizar para rellenar el objeto que se está editando. Esto dará como resultado que la URL sea/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) correo postal a la acción de edición en lugar de la acción de actualización y retire la acción de actualización en su totalidad. Puedes usar request.post? en su acción de edición para verificar si la solicitud es una solicitud de publicación u obtención y luego realizar su actualización y editar acciones usando la misma definición de función.
def edit @user = User.find(params[:id]) if request.post? @user.update_attributes params[:user] ... else ... end end
NOTA: Tenga en cuenta sin embargo que no se puede siempre realmente ocultar la acción POST desde el cliente, ya que siempre se puede ver el código fuente y ver la acción a la que está publicando en su forma.
Aquí es la tercera forma de evitar esto:
En su routes.rb
resources :users
match 'users/:id/edit' => 'users#update', :via => :put, :as => :put_user
En su opinión (edit.html.erb por ejemplo)
<%= form_for @user, :url => put_user_path do |f| %>
...
<% end %>
En su controlador (users_controller.rb por ejemplo)
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
...
else
render 'edit'
end
end
Esto funcionó bien. Gracias. –
Una versión ligeramente más moderno basado en la respuesta de CL Chang
resources :jobs, except: [:update] do
member do
patch 'edit', action: :update, :as => :update_edit
end
end
Esto genera todas las rutas de descanso estándar, a excepción de la ruta de actualización estándar. (Si no desea que todas las acciones, entonces se puede utilizar only: [<your routes not including :update>]
Además, genera
update_edit_job PATCH /jobs/:id/edit(.:format)
Ahora que acaba de actualizar su formulario para especificar la ruta
<%= form_for @job, :url => update_edit_job_path do |f| %>
...
<% end %>
por lo , en lugar de enviar a/actualizar a través de parche, va a/trabajos // editar a través de parche, y esto golpea su acción de actualización
ahora si hay un error, puede procesar la edición, y todo th e errores serán visibles - pero el usuario no se dará cuenta de que la URL es diferente a la edición de un (porque sólo el método es diferente)
def update
@job = Job.find(params[:id])
if @job.update_attributes(user_params)
#redirect somewhere???
else
render 'edit'
end
end
- 1. Renderizar plantilla ERB en plantilla RABL
- 2. Renderizar HTML en plantilla django (no unicode pero ASCII)
- 3. Cambiar sola consulta URL valor de cadena
- 4. Renderizar vista diferente (plantilla) para ActionMailer
- 5. Django: Mejor práctica para URL conf, plantilla de plantilla url
- 6. ¿Cómo cambiar la URL en el navegador sin tener que salir de la página?
- 7. Obtener URL de iframe y actualizar el hash en la URL del navegador
- 8. cómo renderizar un Queryset en una plantilla de tabla-django
- 9. Rieles: ¿Qué significa en realidad "renderizar una plantilla"
- 10. Biblioteca para renderizar BPMN 2.0 en un navegador
- 11. Cómo cambiar la URL que se muestra en el navegador sin salir de la página
- 12. Problema al renderizar una plantilla pasando una variable local
- 13. Cambiar la URL del navegador y el contenido de la página sin recargar y sin usar fragmentos
- 14. Plantilla Backbone/Underscore: ¿cuándo renderizar por qué llamar a JSON?
- 15. url etiqueta de plantilla en la plantilla de Django
- 16. Renderizar parcial a cadena en el controlador o en otro lugar
- 17. ¿Cómo puedo convertir una plantilla EJS en una cadena?
- 18. Desactivar ventana del navegador Cambiar el tamaño
- 19. Renderizar vista parcial en el servidor o enviar datos json y plantilla de representación en el cliente
- 20. ANTS Profiler: ¿Cambiar el navegador predeterminado?
- 21. Cadena aleatoria en plantilla django
- 22. Renderizar plantilla de jade con diseño (sin expreso)
- 23. Pasar el nombre de URL variable a la etiqueta url en la plantilla django
- 24. Renderizar una plantilla ERB con valores de un hash
- 25. Cambiar el tipo de medio css en el navegador
- 26. Cambiar url en solicitud ajax
- 27. Drupal: renderizar una subvista/parcial dentro de la plantilla
- 28. Hiperenlace JLabel para abrir el navegador en la URL correcta
- 29. Renderizar archivo ejs en node.js
- 30. Android: Abrir una URL en un navegador
Al hacer la opción 1, termino con una URL como 'artículos/1/edit? Messages =% 23 'y los errores no se muestran. –
Cameron