Представление в Rails не вызывает переопределенный атрибут доступа - PullRequest
1 голос
/ 23 мая 2009

У меня есть такая модель:

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

Я что-то не так делаю? Или есть лучший способ сделать это?

Редактировать: Добавлены методы доступа с типом транзакции_торговли, которые лучше объясняют, почему я не храню сумму в БД как только положительное число.

1 Ответ

2 голосов
/ 23 мая 2009

У меня была похожая проблема несколько лет назад. Учитывая затраченное время, извините, если я ошибаюсь.

Насколько я помню, помощники по формам используют методы доступа *_before_type_cast. Попробуйте переименовать ваш метод в amount_before_type_cast. Еще немного информации о «проблеме» здесь .

Если, однако, вы ТОЛЬКО хотите, чтобы число было сделано абсолютным в представлениях, но все же хотите использовать число обычным образом в модели, это совершенно неправильный подход, и вместо этого вам следует «дезинфицировать» свои данные. для использования в представлении другим способом (т. е. помощником, в контроллере или с новым пользовательским атрибутом без базы данных в модели).

...