2012-06-19 34 views
1

我正在使用f.semantic_fields_for与hamlsemantic_fields_for不会全部组合成一个li

这里是当前的片段。

 %ul.documents 
     =f.semantic_fields_for :documents do |u| 
      = link_to(u.object.comment.presence || u.object.file.original_filename, u.object.file.url)                      
      = u.input :comment, :as=>:string 
      = u.hidden_field :_destroy 
      = link_to_function image_tag("/img/del_documets.png"), "remove_fields(this)", :class => "btn" 

这里的问题是,只有 “u.input:评论,:如=>:字符串” 是formtastic创作的 “礼” 内。链接和其他字段可以在其他地方找到,并且它不可能正确地设计这个破坏的html。

无论如何要确保一切都在正确的里面吗?

即使我在f.semantic_fields_for之后添加一个li,它将只包装第一个链接,并且以下元素将仅包含完全在ul上方的ul。

回答

1

似乎formtastic总是用<li>包装输入,以避免<fieldsets><ol>之内,这是无效的。

你最好的解决办法是把<li>放在你的所有元素周围,如果你愿意的话可以加上wrapper_html => { :class => :your_class }。这样你可以按照自己的方式来设计风格。

我不认为你需要围绕输入ul.documentssemantic_fields_for已经包装所有使用<ol>

与直接生成html的库不同的是,您最好调整自己的html和css而不是试图让它们生成html。

我会做到这一点(并从中样式我自己的CSS):

=f.semantic_fields_for :documents do |u| 
     %ul.documents 
     %li= link_to(u.object.comment.presence || u.object.file.original_filename, u.object.file.url)                      
     = u.input :comment, :as=>:string 
     %li= u.hidden_field :_destroy 
     %li= link_to_function image_tag("/img/del_documets.png"), "remove_fields(this)", :class => "btn" 

希望这有助于。

+0

问题是,我的所有元素必须在一行。这给了我四个LI,虽然我可以在UL中包装这些LIs,但是这是相当丑陋的 –

+0

也hidden_​​field没有被包装的li –

1

您也可以覆盖Formtastic的默认行为时,它所产生的inputs包装是这样的:

module Formtastic 
    module Inputs 
    module Base 
     module Wrapping 
     def input_wrapping(&block) 
      template.content_tag(:li, 
      [template.capture(&block), error_html, hint_html].join("\n").html_safe, 
      wrapper_html_options 
     ) 
     end 
     end 
    end 
    end 
end 

通知的content_tag(:li。例如,您可以将其替换为content_tag(:div

你知道如何在Rails中覆盖模块方法吗?

+0

这可能是一种获得好结果的方式,但我需要将参数传递给输入以便不更改默认行为。无论如何我无论如何都不满意,因为我没有太多的时间改变一切 –

+0

感谢您的投票! –