假设我有一个 User 模型,其中 facebook_uid 字段对应于用户的 facebook id。
我想允许用户取消链接他的 Facebook 帐户。这样做,我需要将此属性设置为零。
我目前看到两种方法
第一种方式:创建自定义操作并链接到它
# 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,我就无法使用链接而不是按钮。
不过,对于这种情况,您会推荐什么作为最佳和最优雅的解决方案?我错过了第三种选择吗?
解决方案(由 Abdullah Jibaly 建议)
使用更新操作的链接,将要更新的属性作为参数;并处理属性设置为0的情况
= link_to "Unlink your facebook account",
user_path(@user,
:user => { :facebook_uid => 0}),
:method => :put,
:confirm => "Are you sure?"