2015-10-12 3 views
3

В Rails мы можем проверить, изменен ли атрибут модели, используя obj.field_changed?.Rails, Globalize3 проверить, изменились ли переведенные атрибуты?

Скажем, у меня есть модель, которая использует Globalize3.

имеет translates :name

Как я могу проверить, если имя атрибута переоделся?

Что-то вроде obj.name_changed?

+0

более подробно объясните, когда он изменится по той же просьбе или может быть изменен час назад? – matanco

+0

определенно по тому же запросу – Muntasim

ответ

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 
3

Я не уверен, что предлагаемый ответ действительно даст вам ожидаемые результаты.

Скажем, у вас есть

class Post < ActiveRecord::Base 
    translates :name 
end 

Если экземпляр пост:

p = Post.last 

проверить свое название:

p.name 
=> "My old name" 

и изменить имя:

p.name = "My new name" 

Если вы:

p.name_changed? 

вы получите сообщение об ошибке не метод.

Если, как вы предлагаете, вы вызываете класс перевода внутри модели:

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.translation.name_changed? 
=> false 

Результат будет ложным. Это можно объяснить. Если после изменения имени с:

p.name = "My new name" 
=> "My new name" 

p.translation.name вернется:

p.translation.name 
=> "My old name" 

Это потому, что глобализацию хранит переведенные атрибуты в виртуальных атрибутах реализованным переводимой модели.

Вы можете сделать:

p.translation.name = "My new name" 
=> "My new name" 

затем:

p.translation.name_changed? 
=> true 

Однако, вы теряете часть выгоды от использования глобализации.

Что я делаю, что в модели Post, я переопределить геттер и сеттер для виртуального атрибута Я заинтересован в:

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" 

и это, прежде чем сохранить сообщение.

+0

Это помогло объяснить многое, спасибо за это подробное объяснение! –

Смежные вопросы