我正在寻找一种防止用户在未更改任何值的情况下单击我的Rails应用程序中Update方法的更新的方法。如果他们不更改任何值,则我的UPDATE方法将在某些字段中写入空值,因此,如果用户不更改任何详细信息而仅单击更新,则我需要该应用程序来防止更新记录。
任何建议将不胜感激。
仅供参考,这是标准的曲奇切割机更新方法:
def update
if @client.update(client_params)
redirect_to @client, notice: 'Client was successfully updated.'
else
render :edit
end
end
答案 0 :(得分:4)
默认情况下,只有修改了任何一个值,Rails UPDATE方法才会执行。如果未修改任何字段值,则UPDATE方法将不会运行查询,只需检查并返回结果即可。
我将给出相同的示例。我有一个组织模型,在该模型中,我最初使用相同的现有字段值更新了记录:
注意:在更新中,最好发送旧值,以避免将空值存储在数据库中。在您的情况下,更新需要在“ client_params”中定义的所有参数。如果发送了空参数,请包括nil检查或验证,以避免相同的情况。您也可以为此编写自定义更新方法。
答案 1 :(得分:1)
您可以结合使用attributes=
和changed?
方法来实现您的目标。
attributes=
将来自哈希的值分配给模型的实例。
如果模型上的任何值更改,则changed?
会返回true。
采用以下示例:
[1] pry(main)> u = User.all.sample # this returns a random user
=> #<User id: 1319, email: "bob@test.com">
[2] pry(main)> u.changed?
=> false
[3] pry(main)> u.attributes = { email: "bob@test.com" }
=> {:email=>"bob@test.com"}
[4] pry(main)> u.changed?
=> false
[5] pry(main)> u.email
=> "bob@test.com"
[6] pry(main)> u.attributes = { email: "alice@test.com" }
=> {:email=>"alice@test.com"}
[7] pry(main)> u.changed?
=> true
[8] pry(main)> u.email
=> "alice@test.com"
[9] pry(main)> u.save
=> true
应用于代码段时。
def update
@client.attributes = client_params
if @client.changed? && @client.save
redirect_to @client, notice: 'Client was successfully updated.'
else
render :edit
end
end
答案 2 :(得分:1)
您是否可以使用现有值预先填写表格?这样,如果按下更新,则表单将发送之前的内容而不是空白值,并且记录将不会填充空白数据。它也是很好的UX,可以在编辑表单中向用户显示现有值。
答案 3 :(得分:0)
由于 Rails处理ByDefault ,因此无需添加自定义条件来检查您的属性是否已被修改。
如果已检索到修改后的Active Record对象,则它将被保存到数据库中,否则将不执行任何操作。为了更好地理解,您可以通过运行两个查询来自己检查控制台。
用于防止将空值存储在数据库中。请检查是否使用“ PATCH”方法类型来更新记录。
因为只有在一种情况下才有可能:
使用“ PUT”方法更新记录,并仅将修改后的“密钥对”属性提供给 铁轨。 Rails将保存其他未指定的“键值” 具有空值的属性。
在Rails中,“更新”方法有两种方法类型。
(更新全部或部分记录。)
只能更新部分记录
为了遵循更好的HTTP语义,Rails将使用HTTP动词PATCH进行更新。 PATCH允许资源的全部和部分更新,并且更适合Rails更新资源。如果要升级现有的Rails应用程序,HTTP动词PUT仍将映射到以下位置的update操作: RESTful路线,但建议继续使用PATCH。