我使用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
。當然,如果我刪除了getter方法,那麼所有方法都按預期工作。
這是一個錯誤?我該如何解決這個問題?或者,我是否應該採取另一種方法來實現我想完成的目標?
也https://github.com/rails/rails/issues/14307
「[...] [...]您的get_content正在嘗試read_attribute(:title)而不是:content。」是我的錯字,所以我更新了這個問題。但是,如果我用這種方式覆蓋setter方法'def title =(value); write_attribute(:title,value); end'和'def content =(value); write_attribute(:content,value);結束「,那麼它*仍*無法按預期工作。 * P.S. *:也許我不明白你的答案的重點。 – user502052
我不認爲你做到了。不要覆蓋安裝程序。屬性的更新工作正常,他們的回讀(由於您覆蓋獲取者)是錯誤的地方。 – sevenseacat
我再次檢查'@ article.attributes'('#=>#「Old title」:content =>「Old content」>')和數據庫,更新後沒有任何更改。看起來這項任務並沒有按預期工作。 –
user502052