2009-05-23 52 views
1

我有這樣一個模型:查看Rails中不調用重寫屬性訪問器

class Transaction < ActiveRecord::Base 
    def amount 
    self[:amount].abs 
    end 

    def transaction_type 
    read_attribute(:amount) > 0 ? :credit : :debit 
    end 

    def transaction_type=(type) 
    if type == :credit || type == 'credit' 
     self[:amount] = amount.abs 
    elsif type == :debit || type == 'debit' 
     self[:amount] = amount.abs * -1 
    else 
     raise ArgumentError.new 'Type must be credit or debit' 
    end 
    end 
end 

因爲我希望我的量柱始終是正數渲染時。問題顯然是從來沒有視爲這種方法:

<% form_for @transaction do |f| %> 
    <%= f.error_messages %> 
    <p> 
    <%= f.label 'Where?' %><br /> 
    <%= f.text_field :target %> 
    </p> 
    <p> 
    <%= f.label 'What?' %><br /> 
    <%= f.text_field :memo %> 
    </p> 
    <p> 
    <%= f.label 'How much?' %><br /> 
    <%= f.text_field :amount %> 
    </p> 
    <p> 
    <%= f.radio_button :transaction_type, 'debit' %> 
    <%= f.label :transaction_type_debit, 'Debit' %> 
    <%= f.radio_button :transaction_type, 'credit' %> 
    <%= f.label :transaction_type_credit, 'Credit' %> 
    </p> 
    <p><%= f.submit "Submit" %></p> 
<% end %> 

我做錯了什麼?還是有更好的方法來做到這一點?

編輯:添加我的transaction_type訪問器方法,這更好地解釋了爲什麼我沒有在數據庫中存儲金額作爲一個正數。

+1

您能否添加更多信息 - 比如爲什麼不將它作爲正數存儲在數據庫中,而不是在視圖級別進行渲染? – 2009-05-23 00:44:57

回答

2

幾年前,我有類似的問題。考慮到所涉及的時間,如果我錯了,請原諒我。

據我記得,表單助手使用*_before_type_cast訪問器方法。考慮將您的方法重命名爲amount_before_type_cast。有關於「問題」here的更多信息。

但是,如果您只希望在視圖中將數字設爲絕對值,但仍然希望在模型中以通常方式使用數字,則完全是錯誤的方法,您應該「消毒」您的在視圖中以不同方式使用的數據(例如,助手,控制器中或模型上全新的非數據庫定製屬性)。