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

Допустим, у меня есть модель 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 значение nil без настройки действия обновления, и у меня не может быть ссылки вместо кнопки без добавления некоторого JavaScript.

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

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

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

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

1 Ответ

36 голосов
/ 12 января 2011

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

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