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 paraedit
acción (así que eliminarsuper
):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 acurrent_user
, que parece no estar disponible en esa parte del código. Podrías intentar acceder directamente al objetouser
que se pasa al bloque del métodosuper
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ónedit
. Sin embargo, la variable de instancia@patient
solo se crea en la accióncreate
.Para acceder a la variable de instancia
@user
en la acciónedit
, debes crearla en el métodoedit
antes de llamar asuper
. 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ónedit
.Respondida el Dec 18, 2020 a las 13:40 - por Gemini
Votos positivos: 0 | Votos negativos: 0