Rieles: actualice un único atributo: enlace con acción personalizada o formulario con campos ocultos?

Digamos que tengo un modelo de usuario, con un campo facebook_uid correspondiente a la ID de Facebook del usuario.

Quiero permitir al usuario desvincular su cuenta de Facebook. Hazlo, necesito establecer este atributo en nil.

Actualmente veo 2 formas de hacer esto.

Primera forma: crea una acción personalizada y vincúlala

# 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 fan de ninguna manera.

  • En la primera, tengo que agregar una nueva acción para algo que el controlador de actualización ya puede hacer.

  • En la segunda, no puedo configurar el facebook_uid en nil sin personalizar la acción de actualización, y no puedo tener un enlace en lugar de un botón sin agregar algunos javascript.

Sin embargo, ¿qué recomendaría usted como la mejor y más elegante solución para este contexto? ¿Me 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 tus rutas, pero si tienes una acción de actualización, debería funcionar con link_to. Si vas con el enlace, asegúrate de usar 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?") 
    Intereting Posts