作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
这就是我想在 index.html.erb 中编写标记的方式
<%= page_for "Super Cool Page" do |p| %>
<%= p.header do %>
Ruby is Cool
<% end %>
<%= p.body do %>
Witty discourse on Ruby.
<% end %>
<% if page.has_sidebar? %>
<%= p.sidebar do %>
<ul><li>Option 1</li></ul>
<% end %>
<% end %>
<% end %>
哪个会输出
<div class="page">
<header><h1>Super Cool Page</h1></header>
<section>
Witty discourse on Ruby.
</section>
</div>
什么时候page.has_sidebar?是真的
<div class="page">
<header><h1>Super Cool Page</h1></header>
<asside><ul><li>Option 1</li></ul></asside>
<section>
Witty discourse on Ruby.
</section>
</div>
我查看了 Rails 中的 FormHelper
类以获取指导,但似乎我不得不重复很多我试图避免的工作。我真的只是想弄清楚将类/模块/方法卡在框架中的什么位置,以及 |p|
应该是什么类型的对象。
我的第一个想法是创建一个PageBuilder
类来实现header
、body
和sidebar
方法。但是我被困在渲染管道上,无法让所有输出都恰到好处。
是否有 gem 已经提供了这种类型的语义生成?如果没有,我希望了解如何设置它。
最佳答案
我在我的模板中使用了类似的东西。这是一个修改。这应该适用于 Rails 3。
application_helper.rb:
module ApplicationHelper
class PageBuilder
def initialize(title, template)
@title, @template = title, template
@header, @body, @sidebar = nil, nil, nil
@options = { :page => {} , :header => {}, :sidebar => {}, :body => {}, :title => {} }
@logger = Rails.logger
end
def parse(&block)
if block_given?
if @template.respond_to?(:is_haml?) && @template.is_haml?
contents = @template.capture_haml(&block)
else
#erb
contents = @template.capture(&block)
end
else
contents = ""
end
contents
end
def page (options,&block)
options[:class] ||= "page"
@options[:page] = options
parse(&block)
content = ""
content += @template.content_tag(:title, @options[:title]) { @title } unless @title.nil?
content += @template.content_tag(:header,@options[:header]) do
@template.content_tag( :h1) { @header }
end unless @header.nil?
content += @template.content_tag(:asside, @options[:sidebar]) { @sidebar } unless @sidebar.nil?
content += @template.content_tag(:section, @options[:section]) { @body } unless @body.nil?
return @template.content_tag(:div, @options[:page]) { content.html_safe }
end
def header(options={},&block)
@options[:header] = options
@header = parse(&block)
nil
end
def sidebar(options={},&block)
@options[:sidebar] = options
@sidebar = parse(&block)
nil
end
def body(options={},&block)
@options[:body] = options
@body = parse(&block)
nil
end
end
def page_for(title, options = {}, &block )
raise ArgumentError, "Missing block" unless block_given?
builder = PageBuilder.new(title, view_context )
return builder.page(options) do
block.call(builder)
end
end
end
现在,在您的示例代码中,当 page.has_sidebar? == false
,你会得到
<div class="page"><title>Super Cool Page</title><header><h1>
Ruby is Cool
</h1></header><section>
Witty discourse on Ruby.
</section></div>
什么时候 page.has_sidebar? == true
,你会得到
<div class="page"><title>Super Cool Page</title><header><h1>
Ruby is Cool
</h1></header><asside>
<ul><li>Option 1</li></ul>
</asside><section>
Witty discourse on Ruby.
</section></div>
您可以重新排列 page
方法中的内容以获得任何所需的布局作为输出。
关于ruby-on-rails - 如何为 Rails 中的语义布局创建专门的构建器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4770828/
我是一名优秀的程序员,十分优秀!