Как получить доступ к виртуальным атрибутам модели во вложенной форме с помощью Rails

У меня есть базовая вложенная форма. Я хочу получить доступ к виртуальному атрибуту для модели вложенной формы.

Model 1: Lease
  Has_many :transactions
  accepts_nested_attributes_for :transactions, :reject_if => lambda { |a| a[:dated].blank? }, :allow_destroy => true
  ...

Model 2: Transaction
  belongs_to :lease
  def balance_to_date(aDate)
    #Returns the current balance up to aDate
    ...
  end
  ...

Во вложенной форме я хочу поставить что-то вроде:

<td style="width:100px;"><%= nested_f.text_field :dated, size: 8 %> </td>
<td style="width:100px;"><%= nested_f.text_field :label, size: 8 %> </td>
<td style="width:100px;"><%= nested_f.text_field :credit, size: 6  %> </td>
<td style="width:100px;"><%= nested_f.text_field :debit, size: 6  %> </td>
<td style="width:100px;"><%= nested_f.balance_to_date(:dated) %> </td>

И я хочу, чтобы следующее дало мне баланс на сегодняшний день.

nested_f.balance_to_date (: датированный)

Или чтобы иметь возможность сделать что-то вроде

Запуск кода, как показано здесь, дает мне:

undefined method `balance_to_date' for#<ActionView::Helpers::FormBuilder:0xac78bac>

Кроме ошибки виртуального атрибута, эта форма работает как ожидалось.

Код должен создавать редактируемую таблицу транзакций с балансом до этого момента. ( [xx] - мой способ отображения полей ввода).

   Dated         Label      Credit    Debit   Balance  
 [ 1/1/2012 ]  [ Rent due ] [       ] [ 600 ]  -600  
 [ 1/2/2012 ]  [ Payment  ] [ 600   ] [     ]  0 
 [ 2/1/2012 ]  [ Rent due ] [       ] [ 600 ]  -600 
 [ 2/2/2012 ]  [ Payment  ] [ 500   ] [     ]  -100 
 [ 3/1/2012 ]  [ Rent due ] [       ] [ 600 ]  -700 
 [ 3/6/2012 ]  [ late fee ] [       ] [ 50  ]  -750 
 [ 3/7/2012 ]  [ Payment  ] [ 800   ] [     ]  50 
 [ 4/1/2012 ]  [ Rent due ] [       ] [ 600 ]  -550

Будем очень благодарны за любые советы о том, как получить доступ и отобразить этот виртуальный атрибут модели и дату из текущей отображаемой записи. Надеюсь, я не продублировал предыдущий вопрос.

Я использую Rails 3.2.12 и Ruby 1.9.3.

Спасибо! Фил

1 ответ

Решение

Если я понимаю, что вы пытаетесь сделать, вы очень близки. Вам просто нужно детализировать один уровень, чтобы получить доступ к объекту модели, который использует построитель форм:

<td style="width:100px;"><%= nested_f.object.balance_to_date(:dated) %> </td>
Другие вопросы по тегам