2014-03-07 63 views
0

我使用Ruby和我已經覆蓋了一些默認的訪問方法,這種方式更新的屬性:麻煩就當默認的訪問器覆蓋on Rails的4

class Article < ActiveRecord::Base 
    def title 
    self.get_title 
    end 

    def content 
    self.get_content 
    end 
end 

self.get_titleself.get_content方法返回一些計算值,看起來像以下(注:has_one_association:has_oneActiveRecord::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實例的所有工作如預期的那樣:titlecontent值分別與self.has_one_association.titleself.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

回答

0

update_attributes見在這種情況下僅僅是一個捷徑調用title=content=,並save。如果你不覆蓋setter,只是getters,它是不相關的。

您正在更新值,但Rails沒有讀取您設置的值,原因是覆蓋了getters以從關聯中讀取。您可以通過檢查@article.attributes或查看數據庫中的文章記錄來驗證。

此外,您的get_content正在嘗試read_attribute(:title)而不是:content

+0

「[...] [...]您的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

+0

我不認爲你做到了。不要覆蓋安裝程序。屬性的更新工作正常,他們的回讀(由於您覆蓋獲取者)是錯誤的地方。 – sevenseacat

+0

我再次檢查'@ article.attributes'('#=>#

「Old title」:content =>「Old content」>')和數據庫,更新後沒有任何更改。看起來這項任務並沒有按預期工作。 – user502052