¿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.

He intentado renombrar la etiqueta del camino, pero las sugerencias de Rubymine aparecen limitadas, y cualquier otra desviación causaría un error diferente

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 la create método y enviar al usuario a http://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 llegar http://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 decir redirect_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 con redirect_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 end

    En 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