Rails,Globalize3检查翻译的属性是否改变了?

时间:2015-10-12 11:41:43

标签: ruby-on-rails globalize3

在Rails中,我们可以使用obj.field_changed?来检查模型属性是否已更改。

假设我有一个使用Globalize3的模型。

它有translates :name

如何检查名称属性是否已更改?

obj.name_changed?

这样的东西

2 个答案:

答案 0 :(得分:4)

我不确定建议的答案是否真的会给你预期的结果。

说你有

class Post < ActiveRecord::Base
  translates :name
end

如果您实例化帖子:

p = Post.last

检查其名称:

p.name
=> "My old name"

并更改名称:

p.name = "My new name"

如果你这样做:

p.name_changed?

你会得到一个no方法错误。

如果您按照建议在模型中调用翻译类:

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

在保存主要可翻译记录后,您将只能知道您的属性是否已更改。这可能不是你想要的(想象一下你想要生成一个新的slug,根据帖子每次更改时的新名称,你必须再次保存你的帖子。)

您可以尝试(在保存帖子之前)a:

,而不是在方法中调用类
p.translation.name_changed?
=> false

结果将是错误的。这可以解释。如果在使用:

更改名称后
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"

然后:

p.translation.name_changed?
=> true

但是,您失去了使用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"

这样,在保存帖子之前。

答案 1 :(得分:1)

我得到了解决方案。考虑到有人可能会受益,我会将其作为答案发布。

要检查已翻译的属性是否已更改,只需在相应的模型类中打开Translation class提供的Globalize3

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