Struts有Tiles,WebWork可以用sitemesh,而Rails呢?有Capture!
请看活生生的例子先:
例子1:
# layout.rhtml:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>layout with js</title>
</head>
<body>
<%= @greeting %>
</body>
</html>
# view.rhtml:
<% @greeting = capture do %>
Welcome To my shiny new web page!
<% end %>
使用capture方法可以extract任何东西到一个实例变量里(如@greeting),这样就可以在你的模板其他地方甚至layout中使用它了
例子2:
# layout.rhtml:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>layout with js</title>
<script type="text/javascript">
<%= yield :script %>
</script>
</head>
<body>
<%= yield %>
</body>
</html>
# view.rhtml:
<% content_for("script") do %>
alert('hello world')
<% end %>
使用content_for方法也是封装一段html或者javascript或者什么东西,这样可以得到一个变量(如@content_for_script),我们可以在layout中
使用<%= yield :script %>或者<%= @content_for_script %>来使用
好了,看看代码capture_helper.rb:
module ActionView
module Helpers
module CaptureHelper
def capture(*args, &block)
begin
buffer = eval("_erbout", block.binding)
rescue
buffer = nil
end
if buffer.nil?
capture_block(*args, &block)
else
capture_erb_with_buffer(buffer, *args, &block)
end
end
def content_for(name, content = nil, &block)
eval "@content_for_#{name} = (@content_for_#{name} || '') + capture(&block)"
end
private
def capture_block(*args, &block)
block.call(*args)
end
def capture_erb(*args, &block)
buffer = eval("_erbout", block.binding)
capture_erb_with_buffer(buffer, *args, &block)
end
def capture_erb_with_buffer(buffer, *args, &block)
pos = buffer.length
block.call(*args)
data = buffer[pos..-1]
buffer[pos..-1] = ''
data
end
def erb_content_for(name, &block)
eval "@content_for_#{name} = (@content_for_#{name} || '') + capture_erb(&block)"
end
def block_content_for(name, &block)
eval "@content_for_#{name} = (@content_for_#{name} || '') + capture_block(&block)"
end
end
end
end
我们看到content_for实际上是对capture方法的封装,并生成一个以content_for开头的实例变量,而且content_for可以重复定义同一name,这样content会累加
相关文章
不可小视的ERB和capture
分享到:
- 2007-07-03 16:30
- 浏览 3176
- 评论(0)
- 论坛回复 / 浏览 (0 / 2813)
- 查看更多
相关推荐
持续移动且不破坏事物 :factory: :building_construction: :construction: :construction_worker: 正在建设中-请稍后再回来!
Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails 应用程序要快。 Rails::API 可以用来创建只提供API服务(API-Only)的 Rails ...
map_helper 在您的Rails应用程序或其他应用程序中实现Google Maps的简便方法。 ### 依赖关系:jQuery ## Load将map_helper放置在供应商文件夹中。 小贩 JavaScripts map_helper maphelper.coffee /app/assets/...
:dog_face: MiAudota :cat_face: 该应用程序显示可从用户最近的庇护所获取的动物,并允许将其应用到收养过程中,从而完成一份调查表,... Ruby on Rails API; PostgreSQL; Heroku。执照版权所有:copyright:2019, 。
世界风java源码100DaysofCode_R1Log 登录以记录我前 100 天的代码挑战。 总之 可以公平地说,我在这 100 天里取得的大部分成就都是通过承诺挑战和投入工作而实现的,尽我所能在工作和孩子的承诺之间做出贡献。 #100...
Rails管理员状态机 主存储库已移至gitlab,所有新代码将在其中: 从rails_admin正确管理状态 允许从Rails Admin轻松地将state_machine事件发送到模型,包括对ActiveRecord \ Mongoid和自定义状态字段名称的支持以及...
这个 gem 在rails_helper.js.coffee.erb.上的编译时间上嵌入了image_path 、 asset_path和路由表rails_helper.js.coffee.erb. RailsHelper有一些功能。 局限性 这个 gem 只能使用没有命名路由的段。 前任。 # ...
允许您使用为Rails应用程序的前端供电。 是将前端工具像Ruby一样进行编程,纯属喜悦! :smiling_face_with_heart-eyes: 或在运行的检查。 产品特点 :high_voltage: :light_bulb: 即时服务器启动 :high_voltage: ...
《local_time_helper.cr:水晶语言实现的本地时间视图助手》 在软件开发中,特别是Web应用程序,我们经常需要在用户界面中展示当前用户所在时区的时间。这涉及到时区转换和本地化处理,以便为用户提供更加友好和...
SEO 和 Ruby On Rails 由的SEO代理制作的示例应用程序,用于将Rails设置为SEO友好。教程您可以在找到教程,或在。安装 git clone git@github....
安装将 spree_cloudzoom 添加到您的 Gemfile 中: gem 'spree_cloudzoom' 捆绑您的依赖项并运行安装生成器: bundlebundle exec rails g spree_cloudzoom:install测试请务必捆绑您的依赖项,然后为要运行的规范创建...
介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...
gem 'foundation_rails_helper' , '~> 3.0' 然后执行: $ bundle 兼容性 仅完全支持Rails 4.1 / 4.2 / 5/6和Foundation 6 某些功能可能适用于Foundation 5及更早版本,但结果可能会有所不同,并且
word分词器java源码 IMAX.im 功能 依附于 Douban API 创建电影信息库; 上传资源的时候自动解析 Ed2k, Torrent 的信息; 国内在线视频网站播放地址解析; Retina Display 支持; Apple TV API for @盒子大师 系统需求...
Rails的服务器定时响应头 带来Ruby on Rails服务器端性能指标 :chart_increasing: 通过server_timing gem访问Chrome的开发者工具(以及其他支持浏览器)。 生产安全:trade_mark:。 指标是从 gem收集的。 不需要帐户...
参见安装将solidus_geocoding添加到您的Gemfile中: gem 'solidus_geocoding' 捆绑您的依赖项并运行安装生成器: bundlebundle exec rails g solidus_geocoding:install测验首先捆绑您的依赖项,然后运行rake 。...
对Rails的扩展,以允许使用绕道而行,返回简单的工作流浏览器导航。 特征 将您的“ link_to”行切换为“ detour_to”,并将您的控制器“ redirect_to”切换为“ back_or_redirect_to”,以允许用户从其来访者返回。 ...
Textile Editor Helper是Ruby on Rails的插件,可在textareas上方添加Textile工具栏。 此版本的Textile Editor Helper是在上找到的代码的分支,以允许与form_for方法一起使用。 依存关系 要使用Textile Editor ...
Rails Admin内容生成器 使用创建内容的简单方法。 预习 示范 要求 依存关系 MiniMagick 支持的ORM ActiveRecord 支持的资产插件 CarrierWave 安装 使用rails <5和TurboLink <5进行测试 将此行添加到您的...
Ruby on Rails,简称Rails,是基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发更高效、更简洁。本资源"For-Rails-Beginners"显然是为那些希望入门Ruby on Rails的初学者...