Cambiar la acción de edición con el diseño con el controlador personalizado?

Estoy usando el diseño con un controlador personalizado (controlador de usuario, en lugar de diseñar controlador)

Necesitaba cambiar el create acción, que funciona bien. Se ve así:

  def create
   super do |user|
      @patient = user.build_patient
      @patient.save
   end
  end

Pero cuando intento la misma técnica con la edit acción, la variable de instancia parece ser nil cuando se utiliza en la vista (me parece que está bien en el controlador cuando uso byebug/binding.pry para probarlo manualmente)

def edit
# binding.pry
  super do |user|
    if current_user.physician.stripe_details_submitted
      Stripe.api_key = Rails.application.credentials[Rails.env.to_sym][:stripe][:secret_stripe_test_key]
      @stripe_account_dashboard_link = Stripe::Account.create_login_link(current_user.physician.stripe_account).url
    end
  end
end

¿Alguna idea por qué?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por htmlhero


3 Respuestas:

  • Me di cuenta de por qué justo después de escribir la pregunta. Aquí está en caso de que alguien más lo necesite.

    Al cambiar el método de creación utiliza super así:

      def create
       super do |user|
         ...
       end
      end
    
    

    uso de super no necesario para edit acción (así que eliminar super):

    def edit
    
        if current_user.physician.stripe_details_submitted
          Stripe.api_key = Rails.application.credentials[Rails.env.to_sym][:stripe][:secret_stripe_test_key]
          @stripe_account_dashboard_link = Stripe::Account.create_login_link(current_user.physician.stripe_account).url
        end
    
    end
    

    ¡Y eso funciona!

    Respondida el Dec 17, 2020 a las 13:31 - por binarybuilder

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando al intentar cambiar la acción de edición con un controlador personalizado puede estar relacionado con cómo se está gestionando la creación de la variable de instancia. En el caso de la acción create, estás creando directamente la instancia de @patient y guardándola en la base de datos, lo cual funciona bien.

    En el caso de la acción edit, parece que estás intentando acceder a current_user, que parece no estar disponible en esa parte del código. Podrías intentar acceder directamente al objeto user que se pasa al bloque del método super y construir tu lógica a partir de ahí.

    Aquí tienes una sugerencia de cómo podrías modificar tu acción de edit para manejar correctamente la variable de instancia:

    ruby
    def edit
      super do |user|
        @user = user
        if @user.physician.stripe_details_submitted
          Stripe.api_key = Rails.application.credentials[Rails.env.to_sym][:stripe][:secret_stripe_test_key]
          @stripe_account_dashboard_link = Stripe::Account.create_login_link(@user.physician.stripe_account).url
        end
      end
    end
    

    En este caso, asignamos el objeto user a la variable de instancia @user y luego accedemos a sus atributos para construir la lógica necesaria. Asegúrate de que @user esté disponible en tu vista para poder utilizar los datos correctamente.

    Espero que esta sugerencia te ayude a solucionar tu problema. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 13:33 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás intentando acceder a la variable de instancia @patient en la acción edit. Sin embargo, la variable de instancia @patient solo se crea en la acción create.

    Para acceder a la variable de instancia @user en la acción edit, debes crearla en el método edit antes de llamar a super. Puedes hacerlo de la siguiente manera:

    ruby
    def edit
      @user = User.find(params[:id])
      super do |user|
        if current_user.physician.stripe_details_submitted
          Stripe.api_key = Rails.application.credentials[Rails.env.to_sym][:stripe][:secret_stripe_test_key]
          @stripe_account_dashboard_link = Stripe::Account.create_login_link(current_user.physician.stripe_account).url
        end
      end
    end
    

    Ahora, la variable de instancia @user estará disponible en la vista para la acción edit.

    Respondida el Dec 18, 2020 a las 13:40 - por Gemini

    Votos positivos: 0 | Votos negativos: 0