0

我正在开发一个简单的 Rails 应用程序供我自己使用以用于学习目的,并且我正在尝试以 1 种形式处理 2 个模型。我已经按照高级 Rails 食谱第 13 章中的示例进行了操作,并根据我自己的目的对其进行了一些简单的修改。

我拥有的 2 个模型是 Invoice 和 InvoicePhoneNumber。每个 Invoice 可以有多个 InvoicePhoneNumber。我想要做的是确保每张发票至少有 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 方法中的功能似乎不足以解决此问题。

我不是要求一步一步的操作方法(事实上我不想得到一个 - 我想理解这一点),但是有人对这个问题从哪里开始有一些建议吗?

4

2 回答 2

2

部分收集有一个计数器:

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

这将呈现“advertiser/_ad.erb”并将局部变量 ad 传递给模板进行显示。迭代计数器将自动提供给模板,其名称形式为 partial_name_counter。在上面的示例中,模板将被馈送ad_counter

于 2010-01-25T13:37:51.310 回答
1

对于检测一行是否是第一行的问题,您可以在调用部分时添加一个局部变量:

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

因为在主文件中检测起来会容易得多,我猜一行是否是第一行。

除了检测电话号码是否是第一个,您还可以检测电话号码是否是唯一的。如果没有,请在所有数字旁边添加删除链接,否则,不显示删除链接。请注意,除了显示/隐藏链接之外,您还需要添加代码,以防止通过(错误)使用 URL 直接删除数字而不是使用表单来删除最后一个数字。

于 2010-01-25T10:28:47.950 回答