2013-02-15 114 views
0

Rails 3.2.12和Ruby 1.9.3和Haml计算嵌套窗体上的属性?

我想使用属性的计数来控制'link_to'remove''的显示,但我在设置逻辑时遇到问题。

以下是我的表单一些代码,因为它是目前:

.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',但这不起作用,同样的错误被标记。

任何建议,或指点,以帮助我解决这个问题?

谢谢。

解决方案:由于斯科特小

应用程序/控制器/ 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 

这做了它......删除按钮只显示在第二行和后续的属性。

+0

感谢James Scott Jr提供的解决方案: – thomasvermaak 2013-02-21 23:06:52

回答

1

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

因此,如果你想访问关于units_alloc的信息,你可以用codeline.object.units_alloc来访问它们。这会为你提供你的条件数据。

1

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

+0

谢谢@ChuckE ...我将不得不激发灰色细胞来欣赏这里的细微差别...有些研究我会更加赞赏您的观点。 – thomasvermaak 2013-03-30 21:02:31

+0

现在才注意到编辑器没有考虑到我的html标签。我的意思是输入标签,类型=按钮 – ChuckE 2013-03-30 22:34:53