Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails是否在不保存的情况下更新_属性?_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 4_Rails Activerecord - Fatal编程技术网

Ruby on rails Rails是否在不保存的情况下更新_属性?

Ruby on rails Rails是否在不保存的情况下更新_属性?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Rails Activerecord,是否有不保存记录的update\u attributes替代方法 所以我可以这样做: @car = Car.new(:make => 'GMC') #other processing @car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it") #other processing @

是否有不保存记录的
update\u attributes
替代方法

所以我可以这样做:

@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save

顺便说一句,我知道我可以
@car.model='Sierra'
,但我想在一行中更新它们。

您可以使用'attributes'方法:

@car.attributes = {:model => 'Sierra', :years => '1990', :looks => 'Sexy'}
资料来源:

属性=(新属性、保护属性=真) 允许您通过传入一个哈希值,该哈希值中的键与属性名匹配(这同样与列名匹配),一次设置所有属性

如果guard_protected_attributes为true(默认值),则可以使用attr_protected宏保护敏感属性不受这种形式的质量分配的影响。或者,您也可以指定可以使用attr_ACCESS宏访问哪些属性。然后,不允许对未包含在其中的所有属性进行质量分配

class User < ActiveRecord::Base
  attr_protected :is_admin
end

user = User.new
user.attributes = { :username => 'Phusion', :is_admin => true }
user.username   # => "Phusion"
user.is_admin?  # => false

user.send(:attributes=, { :username => 'Phusion', :is_admin => true }, false)
user.is_admin?  # => true
class用户'Phusion',:is_admin=>true}
user.username#=>“Phusion”
user.is#u admin?#=>假的
send(:attributes=,{:username=>'Phusion',:is_admin=>true},false)
user.is#u admin?#=>真的

我相信您正在寻找的是

它与update_属性基本相同,但不保存记录:

class User < ActiveRecord::Base
  attr_accessible :name
  attr_accessible :name, :is_admin, :as => :admin
end

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }) # Raises an ActiveModel::MassAssignmentSecurity::Error
user.assign_attributes({ :name => 'Bob'})
user.name        # => "Bob"
user.is_admin?   # => false
user.new_record? # => true
class用户:admin
结束
user=user.new
user.assign_attributes({:name=>'Josh',:is_admin=>true})#引发ActiveModel::MassAssignmentSecurity::Error
user.assign_属性({:name=>'Bob'})
user.name#=>“Bob”
user.is#u admin?#=>假的
user.new#u记录?#=>真的

您可以使用
分配属性
属性=
(它们是相同的)

更新方法备忘单(适用于Rails 6):

  • 更新
    =
    分配属性
    +
    保存
  • attributes=
    =分配属性的别名
  • update\u属性
    =已弃用,
    update的别名
来源:

另一张备忘单:

要在不保存的情况下为ActiveRecord模型大量分配值,请使用
assign\u attributes
attributes=
方法。这些方法在Rails 3和更新版本中可用。但是,有一些细微的差异和与版本相关的问题需要注意

这两种方法都遵循以下用法:

@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }

@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
请注意,这两个方法都不会执行验证或执行回调;调用
save
时将发生回调和验证

轨道3
attributes=
与Rails 3中的
assign\u attributes
略有不同
attributes=
将检查传递给它的参数是否是散列,如果不是,则立即返回<代码>分配属性没有这样的哈希检查。看

以下无效代码只需返回而不设置属性,就会以静默方式失败:

@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
将默默地执行,就好像分配成功了一样,而实际上没有成功

assign\u attributes
尝试对封闭数组的哈希键进行字符串化时,此无效代码将引发异常:

@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
将为
stringify_key
引发
NoMethodError
异常,表明第一个参数不是散列。异常本身并不能提供关于实际原因的信息,但异常确实发生的事实非常重要

这些情况之间的唯一区别是用于批量分配的方法:
attributes=
以静默方式成功,而
assign\u attributes
引发异常以通知发生了错误

这些示例可能看起来是人为的,并且在一定程度上是人为的,但是当从API转换数据时,或者仅仅使用一系列数据转换而忘记对最终的
.map
的结果进行
哈希[]
时,很容易发生此类错误。在上面维护一些代码50行,并从属性赋值中删除3个函数,那么您就有了失败的秘诀

Rails 3的教训是:始终使用
assign\u attributes
而不是
attributes=

轨道4 在Rails 4中,
attributes=
只是
assign\u attributes
的别名。看

对于导轨4,两种方法均可互换使用。未能将哈希作为第一个参数传递将导致一个非常有用的异常:
ArgumentError:在分配属性时,必须将哈希作为参数传递。

验证 如果您正在为
保存
准备飞行前作业,您可能也会对保存前验证感兴趣。您可以为此使用
valid?
invalid?
方法。两者都返回布尔值<代码>有效?如果未保存的模型通过所有验证,则返回true;如果未通过验证,则返回false<代码>无效?只是
有效?

有效?
可以这样使用:

@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?

这将使您能够在调用
save

之前处理任何验证问题,您说的“不保存记录”是什么意思?更新\u属性将模型保存到数据库中。我想知道是否有一种类似的方法不适用于非破坏性方法。有关详细信息,请参阅您可以使用更新列(名称、值)更新对象的单个属性,而无需调用保存。1.跳过验证。2.将跳过回调。3.如果该列可用,则不会更新该列的更新位置/更新位置。对于3.1+,使用
assign_attributes
您的示例有点误导,因为您没有从模型中粘贴这行:
attr_accessible:is_admi