Rails de mise à Jour d'un seul attribut : lien avec l'action personnalisée ou d'un formulaire avec des champs cachés?

Disons que j'ai un modèle Utilisateur, avec un facebook_uid champ correspondant à l'utilisateur de facebook id.

Je veux permettre à l'utilisateur pour supprimer le lien de son facebook compte. Le faire le faire, j'ai besoin de cet attribut à néant.

Je vois actuellement 2 façons de le faire

Premier moyen : créer une action personnalisée et un lien vers elle

# 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)

Deuxième façon : création d'un formulaire pour la mise à jour existante action

# 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"

Je ne suis pas un grand fan de toute façon.

  • Dans la première, j'ai du ajouter une nouvelle action pour quelque chose que la mise à jour du contrôleur peut déjà le faire.

  • Dans la seconde, je ne peux pas définir le facebook_uid à néant sans la personnalisation de l'action de mise à jour, et je ne peut pas avoir un lien au lieu d'un bouton, sans ajouter un peu de javascript.

Encore, que recommanderiez-vous comme la meilleure et la plus élégante solution pour ce contexte? Ai-je raté une troisième alternative?

Solution (proposée par Abdullah Jibaly)

Utilisez un lien pour la mise à jour d'action, avec l'attribut mettre à jour les paramètres, et de gérer le cas lorsque l'attribut est défini sur 0

= link_to "Unlink your facebook account", 
          user_path(@user, 
                    :user => { :facebook_uid => 0}),
          :method => :put, 
          :confirm => "Are you sure?"
InformationsquelleAutor MrRuru | 2011-01-12