Rails - 更新单个属性:链接自定义操作或隐藏字段的表单?

时间:2011-01-12 16:35:51

标签: ruby-on-rails forms crud hidden-field

假设我有一个User模型,其facebook_uid字段对应于用户的facebook id。

我想允许用户取消他的Facebook帐户的链接。这样做,我需要将此属性设置为nil。

我目前看到有两种方法可以做到这一点

第一种方式:创建自定义操作并链接到它

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

1 个答案:

答案 0 :(得分:36)

不确定您的路线是什么样的,但如果您有更新操作,则应该使用link_to。如果您使用链接,请确保使用PUT或POST方法(理想情况下是PUT,因为它是更新):

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