首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails,Globalize3检查转换后的属性是否有变化?

Rails,Globalize3检查转换后的属性是否有变化?
EN

Stack Overflow用户
提问于 2015-10-12 11:41:42
回答 2查看 928关注 0票数 4

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

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

它有translates :name

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

有点像obj.name_changed?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-15 07:13:22

我找到解决办法了。我张贴它作为一个答案,考虑到有人可能会受益。

要检查转换后的属性是否被更改,只需在相应的模型类中打开Globalize3提供的Globalize3

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2016-02-24 19:07:44

我不知道建议的答案是否真的能给你带来预期的结果。

说你有

代码语言:javascript
复制
class Post < ActiveRecord::Base
  translates :name
end

如果您实例化了一个帖子:

代码语言:javascript
复制
p = Post.last

检查它的名称:

代码语言:javascript
复制
p.name
=> "My old name"

并更改名称:

代码语言:javascript
复制
p.name = "My new name"

如果你这样做了:

代码语言:javascript
复制
p.name_changed?

您将得到一个无方法错误。

如果像您建议的那样,从模型中调用the类:

代码语言:javascript
复制
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

只有在保存了主要可翻译记录之后,您才能知道属性是否发生了更改。这可能不是您想要的(例如,假设您想要生成一个新的段塞,根据它每次更改时的新名称,您将不得不第二次保存您的帖子)。

与在方法中调用类不同,您还可以尝试(在保存帖子之前) a:

代码语言:javascript
复制
p.translation.name_changed?
=> false

结果将是错误的。这是可以解释的。如果在更改名称后使用:

代码语言:javascript
复制
p.name = "My new name"
=> "My new name"

p.translation.name将返回:

代码语言:javascript
复制
p.translation.name
=> "My old name"

这是因为Globalize将转换的属性存储在实例化可翻译模型的虚拟属性中。

你可以这样做:

代码语言:javascript
复制
p.translation.name = "My new name"
=> "My new name"

然后:

代码语言:javascript
复制
p.translation.name_changed?
=> true

但是,您将失去使用Globalize的部分好处。

我所做的是,在Post模型中,我为我感兴趣的虚拟属性重写getter和setter:

代码语言:javascript
复制
def name
  translation.name
end

def name=(val)
  translation.name = val
end

现在,如果我做了:

代码语言:javascript
复制
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"

还有这个,在保住这个职位之前。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33080240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档