Я использую Ruby on Rails 4 и перезаписал некоторый метод доступа по умолчанию следующим образом:
class Article < ActiveRecord::Base
def title
self.get_title
end
def content
self.get_content
end
end
Методы self.get_title
и self.get_content
возвращают некоторое вычисленное значение и выглядят следующим образом (примечание: has_one_association
— это :has_one
ActiveRecord::Association
)
def get_title
self.has_one_association.title.presence || read_attribute(:title)
end
def get_content
self.has_one_association.content.presence || read_attribute(:content)
end
Когда я нахожу и читаю экземпляры @article
из базы данных, все работает так, как ожидалось: значения title
и content
выводятся соответственно с self.has_one_association.title
и self.has_one_association.content
.
Однако я обнаружил, что когда атрибуты назначаются объекту @article
, объект @article
не обновляется должным образом. То есть, учитывая в моем контроллере у меня есть:
def update
# params # => {:article => {:title => "New title", :content => "New content"})}
...
# BEFORE UPDATING
# @article.title # => "Old title" # Note: "Old title" come from the 'get_title' method since the 'title' accessor implementation
# @article.content # => "Old content" # Note: "Old content" come from the 'get_content' method since the 'content' accessor implementation
if @article.update_attributes(article_params)
# AFTER UPDATING
# @article.title # => "Old title"
# @article.content # => "Old content"
...
end
end
def article_params
params.require(:article).permit(:title, :content)
end
Даже если @article
действителен, он не был обновлен в базе данных (!), я думаю, потому что я перезаписываю методы доступа и/или способ, которым Rails assign_attributes
. Конечно, если я удалю методы получения, все будет работать как положено.
Это ошибка? Как я могу решить проблему? Или я должен использовать другой подход, чтобы сделать то, что я хотел бы сделать?
См. также https://github.com/rails/rails/issues/14307.