35

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?

Solution (suggested by Abdullah Jibaly)

Use a link to the update action, with the attribute to update as parameters ; and handle the case when the attribute is set to 0

= link_to "Unlink your facebook account", 
          user_path(@user, 
                    :user => { :facebook_uid => 0}),
          :method => :put, 
          :confirm => "Are you sure?"

1 Answer 1

42

Not sure what your routes look like but if you have an update action it should work with the link_to. If you go with the link make sure you use a method of PUT or POST (ideally PUT because it's an update):

link_to("Unlink your facebook account", user_path(@user, :facebook_uid => nil), :method => :put, :confirm => "Are you sure?")
Sign up to request clarification or add additional context in comments.

3 Comments

I didn't know this feature. Having :facebook_uid => nil does not update the attribute, but I used :user => {facebook_uid => 0} instead, and it suits my needs. Thank you!
is this method safe & reliable?, i mean is it good to carry POST data as a GET query ?
Rails handles this as a post/put request.. See the documentation api.rubyonrails.org/classes/ActionView/Helpers/… "method: symbol of HTTP verb - This modifier will dynamically create an HTML form and immediately submit the form for processing using the HTTP verb specified."

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.