Ruby on rails Rails,3检查转换的属性是否更改?
在Rails中,我们可以使用Ruby on rails Rails,3检查转换的属性是否更改?,ruby-on-rails,globalize3,Ruby On Rails,Globalize3,在Rails中,我们可以使用obj.field\u changed?检查模型属性是否更改 假设我有一个使用Globalize3的模型 它有翻译:name 如何检查名称属性是否已更改 类似于obj.name\u改变了?我得到了解决方案。考虑到有人可能会从中受益,我将其作为一个答案发布 要检查已翻译的属性是否已更改,只需在相应的模型类中打开由Globalize3提供的Translation类 class Post < ActiveRecord::Base translates :name
obj.field\u changed?
检查模型属性是否更改
假设我有一个使用Globalize3
的模型
它有翻译:name
如何检查名称属性是否已更改
类似于
obj.name\u改变了?
我得到了解决方案。考虑到有人可能会从中受益,我将其作为一个答案发布
要检查已翻译的属性是否已更改,只需在相应的模型类中打开由Globalize3
提供的Translation类
class Post < ActiveRecord::Base
translates :name
.......
# Open the Translation class
class Translation
after_save do #you may define a private method as callback method
if name_changed?
#accomplish your tasks...
end
end
end
end
class Post
我不确定提议的答案是否真的能给你预期的结果
说你有
class Post < ActiveRecord::Base
translates :name
end
检查其名称:
p.name
=> "My old name"
并更改名称:
p.name = "My new name"
如果您这样做:
p.name_changed?
您将得到一个无方法错误
如果按照您的建议,从模型中调用Translation类:
class Post < ActiveRecord::Base
translates :name
.......
# Open the Translation class
class Translation
after_save do #you may define a private method as callback method
if name_changed?
#accomplish your tasks...
end
end
end
end
结果将是错误的。这是可以解释的。如果在使用以下命令更改名称后:
p.name = "My new name"
=> "My new name"
p、 translation.name将返回:
p.translation.name
=> "My old name"
这是因为Globalize将转换的属性存储在实例化的可转换模型的虚拟属性中
你可以做:
p.translation.name = "My new name"
=> "My new name"
然后:
但是,您失去了使用Globalize的部分好处
我要做的是,在Post模型中,我覆盖我感兴趣的虚拟属性的getter和setter:
def name
translation.name
end
def name=(val)
translation.name = val
end
现在,如果我这样做:
p.name
=> "My old name"
p.name = "My new name"
=> "My new name"
p.name_changed?
# no method error
p.translation.name_changed?
=> true
p.translation.name
=> "My new name"
在保存帖子之前,请更仔细地解释一下,它是在同一个请求下更改的还是可以在一个小时前更改的?当然是在同一个请求上,Globalize gem中有一个关于此的问题,但它已关闭:这有助于解释很多问题,感谢您的详细解释!
p.translation.name_changed?
=> true
def name
translation.name
end
def name=(val)
translation.name = val
end
p.name
=> "My old name"
p.name = "My new name"
=> "My new name"
p.name_changed?
# no method error
p.translation.name_changed?
=> true
p.translation.name
=> "My new name"