Нужна помощь в модификации нескольких моделей из книги по продвинутым рецептам рельсов - PullRequest
0 голосов
/ 25 января 2010

Я разрабатываю простое приложение rails для собственного использования в учебных целях и пытаюсь работать с 2 моделями в 1 форме. Я следовал примеру в главе 13 «Расширенных рецептов Rails» и заставил его работать с несколькими простыми модификациями для моих собственных целей.

У меня есть две модели: Invoice и InvoicePhoneNumber. Каждый Счет может иметь несколько номеров InvoicePhoneNumbers. Что я хочу сделать, это убедиться, что с каждым счетом связан как минимум 1 номер телефона. Пример в книге помещает ссылку «удалить» рядом с каждым номером телефона (задачи в книге). Я хочу убедиться, что у самого верхнего номера телефона нет ссылки для удаления, но я не могу понять, как это сделать. Частичный шаблон, который производит каждую строку списка телефонных номеров в счете-фактуре, выглядит следующим образом:

<div class="invoice_phone_number">
  <% new_or_existing = invoice_phone_number.new_record? ? 'new' : 'existing' %>
  <% prefix = "invoice[#{new_or_existing}_invoice_phone_number_attributes][]" %>

  <% fields_for prefix, invoice_phone_number do |invoice_form| -%>
    <%= invoice_form.select :phone_type, %w{ home work mobile fax } %>
    <%= invoice_form.text_field :phone_number %>
    <%= link_to_function "remove", "$(this).up('.invoice_phone_number').remove()" %>
  <% end -%>
</div>

Теперь, если бы я мог определить, когда генерируется первый номер телефона, я мог бы поместить условие в функцию link_to_function, чтобы оно не выполнялось. Это наполовину решило бы мою проблему и было бы удовлетворительным, хотя это означало бы, что если бы я действительно хотел, скажем, удалить первый номер телефона и оставить второй, мне пришлось бы сделать некоторые ручные тасования.

Идеальный способ сделать это, предположительно, в браузере с javascript, но я не знаю, как к этому подойти. Мне нужно было бы скрыть ссылку «удалить», когда была только одна, и показать все ссылки «удалить», когда их больше одной. Функциональность в методе .insert_html, который используется в ссылке «добавить номер телефона», кажется недостаточной для этого.

Я не прошу пошаговые инструкции для этого (на самом деле я бы предпочел не получать - я хочу это понять), но есть ли у кого-нибудь предложения о том, с чего начать это проблема?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 января 2010

Имеется счетчик для частичных сборов:

<%= render :partial => "ad", :collection => @advertisements %>  

Это отобразит "рекламодатель / _ad.erb" и передать объявление локальной переменной в шаблон для отображения. Итерация счетчик будет автоматически сделан доступен шаблон с именем в форме В в случае примера выше, шаблон будет подан ad_counter.

1 голос
/ 25 января 2010

Для вашей проблемы определения, является ли строка первой или нет, вы можете добавить локальную переменную при вызове партиала:

<%= render :partial => 'mypartial', :locals => {:first => true}  %>

Поскольку в основном файле было бы намного легче определить, является ли строка первой или нет, я думаю.

Вместо того, чтобы определять, является ли номер телефона первым, вы также можете определить, является ли номер телефона единственным. Если нет, добавьте ссылки удаления рядом со всеми номерами, в противном случае не отображайте ссылку удаления. Обратите внимание, что помимо показа / скрытия ссылки, вам также необходимо добавить код, чтобы предотвратить удаление последнего номера путем (неправильного) использования URL-адреса для непосредственного удаления номера вместо использования вашей формы.

...