Rails-zaktualizuj pojedynczy atrybut: link z niestandardową akcją lub formularz z ukrytymi polami?

Załóżmy, że mam Model użytkownika, z polem facebook_uid odpowiadającym identyfikatorowi facebook użytkownika.

Chcę umożliwić użytkownikowi Odłączenie konta na facebook ' u. Zrób to, muszę ustawić ten atrybut na nil.

Obecnie widzę 2 sposoby na zrobienie tego

Pierwszy sposób: tworzenie niestandardowej akcji i link do niej

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

Drugi sposób: Utwórz formularz do istniejącej akcji aktualizacji

# 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"
Nie jestem wielkim fanem tak czy siak.
  • W pierwszym po pierwsze, muszę dodać nową akcję dla czegoś, co kontroler aktualizacji już może zrobić.

  • W drugim nie mogę ustawić facebook_uid na nil bez dostosowywania akcji aktualizacji i nie mogę mieć łącza zamiast przycisku bez dodawania javascript.

Jednak, co poleciłbyś jako najlepsze i najbardziej eleganckie rozwiązanie w tym kontekście? Przegapiłem trzecią alternatywę?

Rozwiązanie (zasugerowane przez Abdullaha Jibaly)

Użyj odsyłacz do akcji update, z atrybutem update jako parametrami ; i obsłuż przypadek, gdy atrybut jest ustawiony na 0

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

1 answers

Nie wiem, jak wyglądają Twoje trasy, ale jeśli masz akcję Aktualizacji, powinna ona działać z link_to. Jeśli pójdziesz z linkiem upewnij się, że używasz metody PUT lub POST (najlepiej umieścić, ponieważ jest to aktualizacja):

link_to("Unlink your facebook account", user_path(@user, :facebook_uid => nil), :method => :put, :confirm => "Are you sure?")
 36
Author: Abdullah Jibaly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-12 16:50:37