2013-04-09 121 views
4

我很沮丧地使用Rails 3.2并为Bootstrap modals做一个帮手。我不明白你什么时候需要concat,而当你有时候我不知道标签是否丢失,有时候我最终会得到一个包含before和ending标签之间所有选项的散列。当我在任何带do-end的内容标签上使用concat时,所有地狱都会崩溃。所有我想要做的就是复制这个网站:深层嵌套的content_tag,concat和rails 3

<div id="stupid_modal" class="modal hide fade" tabindex="-1" data-width="760"> 
    <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fontello-icon-cancel-1"></i></button> 
     <h4>Modal header</h4> 
    </div> 
    <div class="modal-body"> 
     <div class="page-header"> 
      <p>Test header 1 2 3.</p> 
     </div> 
     <div class="row-fluid"> 

      content here... blah blah 

     </div> 
    </div> 
    <div class="modal-footer"> 
     <button type="button" data-dismiss="modal" class="btn">Close</button> 
     <button type="button" class="btn btn-green">Save changes</button> 
    </div> 
</div> 

我不能为我的生命得到的模态头中的H4按钮得以顺利实施。我也无法将页眉显示在模式主体中。

帮助我的是这样的:

module ModalHelper 
def modal(css_id, header_text, hidden = true, options = {},&block) 
    class_text = "modal" 
    class_text += " hide fade" if hidden 
    content_tag(:div, :class => 'modal hide fade', :id => css_id, :style => ("display:none;" if hidden)) do 
     concat modal_header(header_text) 
     concat modal_body(&block) 
     concat modal_footer 
    end 
end 

def modal_button(link_text, href) 
    modal_caller link_text, href, :button 
end 

def modal_link(link_text, href) 
    modal_caller link_text, href 
end 

private 

def modal_caller(link_text, href, type = nil) 
    options = { :"data-toggle" => "modal" } 
    options.merge!({ :class => "btn" }) if type == :button 
    link_to link_text, "#" + href, options 
end 

def modal_header(header_text) 
    content_tag(:div, :class => 'modal-header') do 
     concat content_tag(:button,(content_tag(:i, :class => 'fontello-icon-cancel-1')),:class => 'close', :"data-dismiss" => 'modal', :"aria-hidden" => 'true') 
     concat content_tag(:h4, header_text) 
    end 
end 

def modal_body(page_header = "") 
    content_tag(:div, :class => 'modal-body') do 
     content_tag(:div, :class => 'page-header') do 
      concat content_tag(:p, page_header) 
     end 
     content_tag(:div, :class => 'row-fluid') do 
      yield 
     end 
    end  
end 

def modal_footer 
    content_tag(:div, :class => 'modal-footer') do 
     concat content_tag(:button, 'Close', type: "button", :class => 'btn btn-boo', :"data-dismiss" => 'modal') 
     concat content_tag(:button, 'Save', type: "button", class: 'btn btn-green') 
    end  
end 

和链接看起来是这样的:

<%= modal_link "New Stupid Modal", "stupid_modal" %> 

而HTML模式是这样的:

<%= modal('stupid_modal', 'Shouldnt this work?', submit: true, tabindex: '-1') do %> 
    <% render 'stupid_modal_partials/stupid_modal' %> 
<% end %> 

outp UT是这样的:

<button aria-hidden="true" class="close" data-dismiss="modal"><i>{:class=&gt;&quot;fontello-icon-cancel-1&quot;}</i></button> 

看起来像这样在页面的源代码:

<i>{:class=>"fontello-icon-cancel-1"}</i> 

更新:

改变modal_header到这个工程:

def modal_header(header_text) 
    content_tag(:div, :class => 'modal-header') do 
     concat content_tag(:button,(content_tag(:i, "",:class => 'fontello-icon-cancel-1')),:class => 'close', :"data-dismiss" => 'modal', :"aria-hidden" => 'true') 
     concat content_tag(:h4, header_text) 
    end 
end 

但这不:

def modal_header(header_text) 
    content_tag(:div, :class => 'modal-header') do 
     concat content_tag(:button,:class => 'close', :"data-dismiss" => 'modal', :"aria-hidden" => 'true') do 
      concat content_tag(:i, "",:class => 'fontello-icon-cancel-1') 
     end 
     concat content_tag(:h4, header_text) 
    end 
end 

哪个问题,wzup与concat?并且我错过了一些东西 - 我还尝试了空引号作为按钮的第二个参数content_tag

+0

而且我已经试过按钮标记的content_tag do-end内的i标记而不是内联。没爱。 – 2013-04-09 06:20:10

+0

本文解释'concat'和'capture'的用户:http://thepugautomatic.com/2013/06/helpers/ – 2014-10-16 10:44:06

回答

10

您不需要永远使用concat

每个Rails的助手返回一些HTML中的字符串吧:

tag(:br) # "<br>" 

所以你简单的辅助方法,会是这样:

# "<br>" 
def br 
    tag(:br) 
end 

如果你有HTML的多串只是总结起来:

# "<button>Close</button><button>Save</button>" 
def modal_buttons 
    content_tag(:button, "Close") + content_tag(:button, "Save") 
end 

请注意,您不能只调用它们,因为它们不会修改视图

# "<button>Save</button>" 
def modal_buttons 
    content_tag(:button, "Close") # this won't do anything 
    content_tag(:button, "Save") 
end 

对于块相同的规则:

# "<div><button>Close</button><button>Save</button></div>" 
def modal_footer 
    content_tag(:div) do 
    # what block returns will be inside the div 
    content_tag(:button, "Close") + content_tag(:button, "Save") 
    end 
end 

def modal_body 
    content_tag(:div) do 
    modal_header + yield + modal_footer 
    end 
end 

作为一个侧面说明,只使用Rails的助手来构建整个观点是不是真的自己预期的目的。他们应该是帮助你在动态的地方,静态HTML是在ERB模板更好地完成。

+0

这很有帮助。会尝试。我想到了modals的助手,并且使用主体部分是清理我的观点的好方法。 – 2013-04-09 18:41:19