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

Posted

技术标签:

【中文标题】Rails - 更新单个属性:与自定义操作或带有隐藏字段的表单链接?【英文标题】:Rails - Update a single attribute : link with custom action or form with hidden fields? 【发布时间】:2011-06-07 23:05:56 【问题描述】:

假设我有一个 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】:

不确定您的路线是什么样的,但如果您有更新操作,它应该可以与 link_to 一起使用。如果您使用该链接,请确保使用 PUT 或 POST 方法(最好是 PUT,因为它是更新):

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

【讨论】:

我不知道这个功能。拥有 :facebook_uid => nil 不会更新属性,但我使用 :user => facebook_uid => 0 代替,它适合我的需要。谢谢! 这种方法安全可靠吗?我的意思是把 POST 数据作为 GET 查询携带好吗? Rails 将其作为 post/put 请求处理。请参阅文档 api.rubyonrails.org/classes/ActionView/Helpers/… "method:HTTP 动词的符号 - 此修饰符将动态创建 HTML 表单并立即提交表单以使用指定了 HTTP 动词。”

以上是关于Rails - 更新单个属性:与自定义操作或带有隐藏字段的表单链接?的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 有没有办法更新单个属性?

我啥时候使用保存!,创建!和更新属性!在 Rails 中?

如何使 didSelectRowAt IndexPath 与自定义委托一起使用

Rails 5:将belongs_to关联与自定义名称添加到模型和迁移

Ruby on Rails 无需密码即可更新用户属性

如何在Rails中使数据库字段为只读?