web-dev-qa-db-ja.com

Rails-単一の属性を更新します:カスタムアクションとのリンクまたは非表示フィールドを持つフォーム?

ユーザーのFacebookIDに対応するfacebook_uidフィールドを持つユーザーモデルがあるとします。

ユーザーが自分の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)

2番目の方法:既存の更新アクションのフォームを作成します

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

私はどちらの方法も大ファンではありません。

  • 最初のアクションでは、更新コントローラーが既に実行できる何かに対して新しいアクションを追加する必要があります。

  • 2つ目では、更新アクションをカスタマイズせずにfacebook_uidをnilに設定することはできません。また、JavaScriptを追加せずにボタンの代わりにリンクを設定することはできません。

それでも、このコンテキストに最適で最もエレガントなソリューションとして何をお勧めしますか?私は3番目の選択肢を逃しましたか?

解決策(Abdullah Jibalyが提案)

更新する属性をパラメーターとして使用して、更新アクションへのリンクを使用します。属性が0に設定されている場合を処理します

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

ルートがどのように見えるかはわかりませんが、更新アクションがある場合は、link_toで機能するはずです。リンクを使用する場合は、必ずPUTまたはPOST(更新であるためPUT)のメソッドを使用してください):

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