我正在开发一个简单的rails应用程序供我自己用于学习目的,我正在尝试以1种形式处理2个模型。我已经按照Advanced Rails Recipes第13章中的示例进行了操作,并且已经根据自己的目的进行了一些简单的修改。
我拥有的2个型号是Invoice和InvoicePhoneNumber。每个发票都可以有多个InvoicePhoneNumbers。我想要做的是确保每张发票至少有一个与之关联的电话号码。书中的示例在每个电话号码旁边放置一个“删除”链接(书中的任务)。我想确保最顶层的电话号码旁边没有删除链接,但我无法弄清楚如何执行此操作。生成发票中电话号码列表每一行的部分模板如下;
<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方法中的功能似乎不适合。
我不是要求为此逐步操作(实际上我不想得到一个 - 我想了解这一点),但有没有人有一些关于从哪里开始的建议这个问题?
感谢。
答案 0 :(得分:2)
There is a counter for partial-collections:
<%= render :partial => "ad", :collection => @advertisements %>
此 将呈现“advertiser / _ad.erb”和 将局部变量ad传递给 用于显示的模板。迭代 计数器将自动生成 可用于具有名称的模板 partial_name_counter形式。的在 以上例子的情况, 模板将被投放
ad_counter
。
答案 1 :(得分:1)
对于检测行是否是第一行的问题,可以在调用partial时添加局部变量:
<%= render :partial => 'mypartial', :locals => {:first => true} %>
因为在主文件中检测起来要容易得多,我猜是否是第一行。
您可以检测电话号码是否是唯一的,而不是检测电话号码是否是第一个。如果没有,请在所有数字旁边添加删除链接,否则不显示删除链接。请注意,除了显示/隐藏链接外,您还需要添加代码,以防止使用URL删除最后一个号码(错误)直接删除号码而不是使用您的表单。