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.
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? –
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
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). –