2010-01-25 3 views
0

Я разрабатываю приложение простых рельсов для собственного использования в учебных целях, и я пытаюсь обрабатывать 2 модели в 1 форме. Я следил за примером в главе 13 Advanced Rails Recipes и получил его с несколькими простыми модификациями для моих собственных целей.Нужна помощь в модификации нескольких примеров моделей из передовых релейных рецептов book

2 модели у меня есть счет-фактура и номер счета-фактуры. Каждый счет-фактура может иметь несколько номеров счетов-фактур. Я хочу, чтобы каждый счет-фактура имел по крайней мере 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, которая используется в ссылке «добавить номер телефона», кажется недостаточной для этого.

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

Спасибо.

ответ

1

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

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

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

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

2

There is a counter for partial-collections:

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

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

+0

О, хорошо, не знал этого! – Veger

+0

Спасибо, немного возиться, у меня это работает.Похоже, очень полезный метод, который я смогу использовать в другом месте. Это хорошая временная проблема для моей проблемы, но она не касается вопроса о том, чтобы оставить первый номер телефона un-delete-able (который поражает меня как-то для решения в javascript). Спасибо хоть. – brad