2009-05-23 6 views
1

J'ai un modèle comme celui-ci:Voir Rails ne demande pas d'attribut accesseur substituée

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 

Parce que je veux que ma colonne montant à toujours un nombre positif lors du rendu. Le problème est apparemment la vue n'appelle jamais cette méthode:

<% 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 %> 

Est-ce que je fais quelque chose de mal? Ou y a-t-il une meilleure façon de faire cela?

Edit: Ajout mes méthodes accesseurs de TRANSACTION_TYPE, qui explique mieux pourquoi je ne suis pas le stockage montant dans la base de données comme un nombre positif.

+1

Pouvez-vous ajouter un peu plus d'informations - comme pourquoi ne pas simplement le stocker comme un nombre positif dans la base de données au lieu de faire le rendu au niveau de la vue? –

+0

Oui, à part comment vous pouvez le faire fonctionner, je serais d'accord avec Sarah. À mon humble avis, s'il n'y a pas d'autres exigences que vous n'avez pas mentionnées, il serait préférable que vous l'avez enregistré comme un nombre positif. – Petros

+0

J'ai ajouté une partie du code "manquant" de mon modèle de transaction pour aider à expliquer ce que je fais. Je veux que mon avis traite le montant comme un nombre positif qui a un type de transaction (crédit, débit), mais ne stocke pas le type de transaction dans le DB (ce qui serait redondant). –

Répondre

2

J'ai eu un problème similaire il y a quelques années. Compte tenu du temps, excusez-moi si je me trompe. Autant que je me souvienne, les aides à la forme utilisent les méthodes d'accès *_before_type_cast. Envisagez de renommer votre méthode en amount_before_type_cast. Il y a plus d'informations sur le "problème" here. Si, toutefois, vous souhaitez uniquement que le nombre soit rendu absolu dans les vues, mais que vous souhaitiez toujours utiliser le numéro de la manière habituelle dans le modèle, cette approche est totalement fausse et vous devriez plutôt "désinfecter" votre données à utiliser dans la vue d'une manière différente (par exemple, une aide, dans le contrôleur ou avec un nouvel attribut personnalisé non databasé sur le modèle).