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?"
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?")
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