在嵌套表单上计算属性?

时间:2013-02-15 18:32:54

标签: if-statement count nested-attributes

Rails 3.2.12和Ruby 1.9.3和Haml

我想使用属性计数来控制'link_to“删除”'的显示,但我在设置逻辑方面遇到了问题。

以下是我目前表单中的一些代码:

    .field
      = codeline.label :name, "Units Alloc"
      %br/
      = codeline.text_field :units_alloc, :precision => 6, :scale => 2, :size => 10,
       :class => "ui-state-default"
      = codeline.hidden_field :_destroy
      = link_to "remove", '#', class: "remove_fields"

这很有效,但我显示了'删除'链接,我希望它只显示有两个:units_alloc属性。

这就是我的尝试:

    .field
      = codeline.label :name, "Units Alloc"
      %br/
      = codeline.text_field :units_alloc, :precision => 6, :scale => 2, :size => 10,
       :class => "ui-state-default"
      - if :units_alloc.count > 1
      = codeline.hidden_field :_destroy
      = link_to "remove", '#', class: "remove_fields"

这是我的错误:

       NoMethodError in Contracts#new

       Showing /home/tom/rails_projects/tracking/app/views/contracts
       /_codeline_fields.html.haml where line #9 raised:

       undefined method `count' for :units_alloc:Symbol

如果我在参数中使用units_alloc而不是符号,我仍会收到错误:

        NameError in Contracts#new

        Showing /home/tom/rails_projects/tracking/app/views/contracts
        /_codeline_fields.html.haml where line #9 raised:

        undefined local variable or method `units_alloc' for
        #<#<Class:0xadbde90>:0xa8956e8>

我尝试使用'codeline.units_alloc',但这不起作用,并标记了相同的错误。

有任何建议或指示可帮助我解决此问题吗?

感谢。

解决方案:感谢James Scott Jr。

应用程序/控制器/ contracts_controller.rb

  def New
     @show_remove = false
     ....
     ....
   end

应用程序/视图/合同/ _codelines_fields.html.haml

   .field
      = codeline.label :name, "Units Alloc"
      %br/
      = codeline.text_field :units_alloc, :precision => 6, :scale => 2, :size => 10,
       :class => "ui-state-default"
      - if @show_remove
          = codeline.hidden_field :_destroy
          = link_to "remove", '#', class: "remove_fields"
      - else
         - @show_remove = true

就是这样......删除按钮只显示在第二行和后续属性行中。

2 个答案:

答案 0 :(得分:1)

当你处于表单(部分)时,代码行不会引用表单(部分)所针对的Codeline实例,而是一个ActionView :: Helpers :: FormBuilder的实例。简单知道如何将信息关联到Codeline的实例。你知道,因为在部分的第一行,你有codeline.object.build_code

因此,如果要访问有关units_alloc关联的信息,可以使用codeline.object.units_alloc访问它们。这将为您提供有条件的数据。

答案 1 :(得分:1)

我想补充一点,如果你的锚标记的目的是使用一些javacscript从表单列表中删除元素,你可能会使用错误的控件。锚标签不是表单元素,它们应指向资源/内容,而不是用作动画/客户端行为触发器。根据您描述的用例,输入标记类型=按钮对于您似乎想要实现的内容将是一个更合适的元素。