gpt4 book ai didi

ruby-on-rails - 如何为 Rails 中的语义布局创建专门的构建器?

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:04 28 4
gpt4 key购买 nike

这就是我想在 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 类来实现headerbodysidebar 方法。但是我被困在渲染管道上,无法让所有输出都恰到好处。

是否有 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com