Подтвердить что ты не робот

Rails - обновление одного атрибута: ссылка на пользовательское действие или форму со скрытыми полями?

Скажем, у меня есть модель User, с полем facebook_uid, соответствующим идентификатору пользователя facebook.

Я хочу, чтобы пользователь мог отключить свою учетную запись в facebook. Сделайте так, мне нужно установить этот атрибут в nil.

В настоящее время я вижу 2 способа сделать это

Первый способ: создать настраиваемое действие и ссылку на него

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

Второй способ: создать форму для существующего действия обновления

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

Я не большой поклонник в любом случае.

  • В первом я должен добавить новое действие для того, что уже может сделать контроллер обновлений.

  • Во втором случае я не могу установить facebook_uid в noil без настройки действия обновления, и у меня не может быть ссылки вместо кнопки без добавления javascript.

Тем не менее, что бы вы рекомендовали как лучшее и самое элегантное решение для этого контекста? Я пропустил третью альтернативу?

Решение (предложенное Абдуллой Джибали)

Используйте ссылку для действия обновления, с атрибутом для обновления в качестве параметров; и обрабатывать случай, когда для атрибута установлено значение 0

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

Ответ 1

Не знаете, как выглядят ваши маршруты, но если у вас есть действие по обновлению, оно должно работать с link_to. Если вы перейдете по ссылке, убедитесь, что вы используете метод PUT или POST (в идеале PUT, потому что это обновление):

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