ruby-on-rails - resultados - formularios anidados rails
Rieles: actualice un solo atributo: enlace con acción personalizada o formulario con campos ocultos. (1)
Digamos que tengo un modelo de usuario, con un campo facebook_uid correspondiente a la identificación de Facebook del usuario.
Quiero permitir que el usuario desvincula su cuenta de Facebook. Hazlo, necesito establecer este atributo en cero.
Actualmente veo 2 maneras de hacer esto
Primera forma: crear una acción personalizada y vincularla
# app/controllers/users_controller.rb
def unlink_facebook_account
@user = User.find params[:id]
# Authorization checks go here
@user.facebook_uid = nil
@user.save
# Redirection go here
end
# config/routes.rb
ressources :users do
get ''unlink_fb'', :on => :member, :as => unlink_fb
end
# in a view
= link_to "Unlink your facebook account", unlink_fb_path(@user)
Segunda forma: crear un formulario para la acción de actualización existente
# app/views/user/_unlink_fb_form.html.haml
= form_for @user, :method => "post" do |f|
= f.hidden_field :facebook_uid, :value => nil
= f.submit "Unlink Facebook account"
No soy un gran admirador de ninguna manera.
En el primero, tengo que agregar una nueva acción para algo que el controlador de actualización ya puede hacer.
En el segundo, no puedo establecer el facebook_uid en cero sin personalizar la acción de actualización, y no puedo tener un enlace en lugar de un botón sin agregar algo de javascript.
Aún así, ¿cuál recomendaría como la mejor y más elegante solución para este contexto? ¿Perdí una tercera alternativa?
Solución (sugerida por Abdullah Jibaly)
Use un enlace a la acción de actualización, con el atributo para actualizar como parámetros; y manejar el caso cuando el atributo se establece en 0
= link_to "Unlink your facebook account",
user_path(@user,
:user => { :facebook_uid => 0}),
:method => :put,
:confirm => "Are you sure?"
No estoy seguro de cómo son sus rutas, pero si tiene una acción de actualización, debería funcionar con el link_to. Si utiliza el enlace, asegúrese de utilizar un método de PUT o POST (idealmente PUT porque es una actualización):
link_to("Unlink your facebook account", user_path(@user, :facebook_uid => nil), :method => :put, :confirm => "Are you sure?")