Rails - Update a single attribute : link with custom action or form with hidden fields?
- by MrRuru
Let's say I have a User model, with a facebook_uid field corresponding to the user's facebook id.
I want to allow the user to unlink his facebook account. Do do so, I need to set this attribute to nil.
I currently see 2 ways of doing this
First way : create a custom action and link to it
# 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)
Second way : create a form to the existing update 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"
I'm not a big fan of either way.
In the first one, I have to add a new action for something that the update controller already can do.
In the second one, I cannot set the facebook_uid to nil without customizing the update action, and I cannot have a link instead of a button without adding some javascript.
Still, what would you recommend as the best and most elegant solution for this context? Did I miss a third alternative?