¿Cómo puedo redirigir el índice después de enviar un nuevo registro en el front-end? [Rubymine 2020.2.3, Ruby.2.7.2p137, gem 3.1.2]
Estoy luchando con un curso de proyecto universitario, y he estado atrapado con este error durante semanas, a pesar de las sugerencias proporcionadas por colegas y tutores.
En mi método de creación para una tabla dada. Estoy tratando de tener la página que contiene los formularios para nuevas entradas de registro redirigir a la página índice después de guardar. En su lugar, me redirecciono a este error, destacando @courier=Courier.new(courier_new_path) con el error afirmando que no es un hash, y no me redirecciona de nuevo en índice. Sin embargo, al buscar manualmente el índice, veo que la cadena de datos se actualizaría.
Lo siguiente es el método de creación en la página del controlador (courier_controller.rb):
def create
@courier=Courier.new(params.require(:courier).permit(:courier_name,:courier_email))
@courier.save
redirect_to courier_path(@courier)
@courier=Courier.new(courier_new_path)
if @courier.save
redirect_to(:controller=>'courier' ,:action=>'index')
else
render('new')
end
end
Aquí está el código para la página del formulario (courier/new/html.erb):
Courier#new
Find me in app/views/courier/new.html.erb
<%= form_with scope: :courier, :url => {:action => 'create'}, local: true do |f| %>
<%= f.label :courier_name %>
<%= f.text_field :courier_name %>
<%= f.label :courier_email %>
<%= f.text_field :courier_email %>
<%= f.submit %>
<% end %>
He tratado de renombrar a @courier como Courier.new(courier_create_path) o Courier.nwww(courier_path), he intentado buscar argumentos usando una forma precipitada, pero ninguno parecía equívoco ni traducible como una solución a mi problema.
Cualquier sugerencia ayudaría. Esto es parte de un proyecto universitario, y como estudiante multimedia no tan astuto en la programación en comparación con otros compañeros, apreciaría las sugerencias que puedo probar.
Muchas gracias por adelantado.
Pregunta hecha hace 3 años, 4 meses, 28 días - Por codecrusaderx
3 Respuestas:
-
¿Alguien ha intentado explicar lo que está pasando en su método de creación? He añadido comentarios después de cada línea para decir lo que esa línea está haciendo.
def create @courier=Courier.new(params.require(:courier).permit(:courier_name,:courier_email)) # use the params to build a new courier record (the permit part is usually in a separate method that other methods can access but it works this way) @courier.save # Save the new courier record to the database redirect_to courier_path(@courier) # Send the user back to the "show" page of the courier record (not index!) @courier=Courier.new(courier_new_path) # this makes no sense, you are trying to create a new courier object using a path method # Basically you are saying: @courier = Courier.new('/courier/new') if @courier.save #you are trying to save this record that will fail because you can't create a courier by passing it a url redirect_to(:controller=>'courier' ,:action=>'index') #send the user to the index page of the courier views. else render('new') #something went wrong so go back to the new courier form. end end
Cuando tu programa llegue a la línea 4
redirect_to courier_path(@courier)
va a salir de lacreate
método y enviar al usuario ahttp://my_app:3000/couriers/1
donde el número 1 sería el ID en la base de datos del registro que acaba de crear. Esto se relacionaría con el archivo en su app en app/views/couriers/show.html.erb. Suena como si quisieras llegarhttp://my_app:3000/couriers
que presenta al usuario con la aplicación/views/couriers/index.html.erb No sé por qué estás haciendo nada después de esa línea.También no está claro qué error estás recibiendo. Necesitas mirar tu consola webserver, el lugar donde ejecutas "rails s" que muestra todas las comunicaciones entre el navegador y tu app. encontrar el rastro de la pila que comienza con el error real, y añadir eso a su pregunta anterior (no lo pegue en un comentario, será demasiado largo e imposible de leer).
Creo que solo necesitas:
def create @courier=Courier.new(params.require(:courier).permit(:courier_name,:courier_email)) if @courier.save redirect_to @courier #if you want to redirect to their 'show" page else render('new') #something went wrong so go back to the new courier form. end end
Lo que podría ser confuso para un nuevo programador es que Rails está haciendo tanto "mágico" detrás de las escenas se vuelve muy confuso si ya no sabes los conceptos subyacentes que suceden detrás de las escenas. Estás diciendo
redirect_to(:controller=>'courier' ,:action=>'index')
que dice específicamente "ir a la página índice de los mensajeros" pero se puede decirredirect_to @courier
y asumirá que usted quiere ir a la página que muestra el registro del mensaje que acaba de crear. Si realmente quieres ir a la mesa que muestra todos los correos que reemplazaría eso conredirect_to :couriers
El símbolo:couriers
le dice que vaya al método índice del controlador de correos.Respondida el Dec 17, 2020 a las 14:16 - por gitguru
Votos positivos: 0 | Votos negativos: 0 -
El problema en tu código radica en que estás creando un nuevo objeto
@courier
después de haber redirigido la página, lo cual no tiene mucho sentido. Además, estás intentando guardar el@courier
dos veces, lo cual también es innecesario. Para redirigir a la página de índice después de guardar un nuevo registro, simplemente debes hacer la redirección una sola vez y eliminar la creación redundante del objeto@courier
.Aquí te dejo la corrección del código en tu controlador
courier_controller.rb
:ruby def create @courier = Courier.new(params.require(:courier).permit(:courier_name, :courier_email)) if @courier.save redirect_to couriers_path
Redirige a la página de índice de los couriers
else render('new') end endEn este código, una vez que se guarda exitosamente el
@courier
, se redirige automáticamente a la página de índice de los couriers. Si falla la creación, se renderiza nuevamente la página de creación (new
).Con estos cambios, el problema que estás enfrentando debería resolverse y ahora la redirección debería funcionar correctamente. Espero que esta corrección te ayude a avanzar en tu proyecto universitario. ¡Suerte! Si tienes alguna otra pregunta o duda, no dudes en preguntar.
Respondida el Dec 18, 2020 a las 14:20 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema es que estás intentando crear un nuevo objeto
@courier
después de guardar el primero. Esto provoca el error porque@courier
ya es un objeto de base de datos y no un hash.Para resolverlo, puedes eliminar esta línea:
@courier=Courier.new(courier_new_path)
El código corregido debería verse así:
def create @courier=Courier.new(params.require(:courier).permit(:courier_name,:courier_email)) @courier.save redirect_to courier_path(@courier) if @courier.save redirect_to(:controller=>'courier' ,:action=>'index') else render('new') end end
Respondida el Dec 18, 2020 a las 14:30 - por Gemini
Votos positivos: 0 | Votos negativos: 0