Qual é o valor de si mesmo em um modelo Rails e por que os métodos de instância óbvios não estão disponíveis?
Eu tenho um método de acessador personalizado no meu aplicativo rails 3.1.6 que atribui um valor a um atributo, mesmo se o valor não estiver presente.O atributo my_attr é um Hash serializado que deve ser mesclado com o valor fornecido, a menos que um valor em branco seja especificado , caso em que irá definir o valor atual para um valor em branco. (Existem verificações adicionadas para garantir que os valores sejam o que deveriam ser, mas são removidos por brevidade, pois não fazem parte da minha pergunta.) Meu setter é definido como:
def my_attr=(new_val)
cur_val = read_attribute(:my_attr) #store current value
#make sure we are working with a hash, and reset value if a blank value is given
write_attribute(:my_attr, {}) if (new_val.nil? || new_val.blank? || cur_val.blank?)
#merge value with new
if cur_val.blank?
write_attribute(:my_attr, new_val)
else
write_attribute(:my_attr,cur_val.deep_merge(new_val))
end
read_attribute(:my_attr)
end
Esse código funciona bem como está, mas não quando eu uso self.write_attribute (). Eu então recebo o seguinte erro:
NoMethodError:
private method `write_attribute' called for #<MyModel:0x00000004f10528>
Minhas perguntas são assim: Parece mais lógico ter write_attribute disponível para uma instância, então por que ela está disponível apenas para a classe enão para a instância? Há algo faltando no meu conhecimento fundamental deauto em Ruby ou Rails (ou ambos)?