Pregunta

Me preguntaba ¿por qué cuando creas rutas relajantes en rieles con map.resources genera acciones para nuevo, crear, editar, actualizar ? ¿Hay algo de malo en declarar solo una acción para crear y actualizar y hacer algo como esto?

def create
  unless post?
     @user = User.new
  else
     redirect_to :action => 'index' if user.create(params[:user])
  end
end

para que podamos tener algo como

:GET  users/create # to show the form (same as action - new)
:POST users/create # to create a new user

dado que Restful se basa en verbos, ¿no sería este el mejor enfoque para usar?

Gracias por su atención

¿Fue útil?

Solución

Creo que hay dos problemas relacionados pero distintos aquí: las URL expuestas y los métodos de controlador a los que se enrutan. Dado que cualquiera de estos podría cambiarse de forma independiente, los abordaré por separado. Además, tenga en cuenta que hablaré un poco sin apretar, y estrictamente sobre REST implementado en el contexto de Rails.

En términos de las URL externas, creo que es útil distinguir entre las URL que componen la API del sistema (: GET users / 1 , : PUT users / 1 , etc.) y las URL que están ahí solo para conveniencia de los humanos usando un navegador web ( users / new , users / 5 / edit , etc.). La API se trata de buscar recursos o interactuar con ellos de alguna manera: estas son las URL que otra computadora usará al interactuar con su sistema. Estas URL suelen ser solo la dirección del recurso con el que desea interactuar, y luego utiliza el método HTTP y los parámetros para indicar qué es lo que quiere hacer (GET = muéstrame este recurso, PUT = cambiar este recurso, etc. ) Las URL de conveniencia están ahí para mostrar un formulario para que sea más fácil para un humano usar la API. Usted podría editar un usuario utilizando curl para escribir manualmente todos los parámetros que desea cambiar y hacer una POST a los usuarios / 1, pero como humano es mucho más fácil si solo puede usar un formulario .

Para ver sus ejemplos anteriores, entonces, : GET users / create puede tener sentido (y es bastante similar a : GET users / new que es el valor predeterminado) , pero : POST usuarios / crear se traduciría aproximadamente a "crear uno nuevo de usuarios / crear", lo que no tiene mucho sentido.

En cuanto a los métodos del controlador, " nuevo " y "crear" están realizando tareas fundamentalmente diferentes, como debería quedar claro en los párrafos anteriores. Uno de ellos muestra un formulario y el otro crea un nuevo recurso. podría sobrecargar el mismo método para hacer esto, por supuesto, pero sin una razón convincente para hacerlo, crear dos pequeños métodos independientes para manejar dos pequeñas tareas independientes es probablemente un enfoque más natural.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top