今天我遇到了视图助手功能"提供".通过查看其手册,我仍然对它与"content_for"的区别感到困惑.
提供(name,content = nil,&block)
与content_for相同,但与流式传输一起使用时直接返回布局.换句话说,如果要在呈现给定模板时多次连接到同一缓冲区,则应使用content_for,否则,使用provide来告诉布局停止查找更多内容.
问题1:这对我来说非常抽象 - 任何人都可以通过给出一个示范性的例子来充实它吗?
问题2:使用资产管道,性能更好,为什么?
谢谢!
我有一个_header.html.erb部分,这是我放置导航栏的地方
在我的启动页面上,我不想显示导航栏.
这是body
application.html.erb
<body>
<%= render 'layouts/header' %>
<div id="container">
<%= yield %>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
如何在除特定控制器上的特定操作之外的每个操作上呈现它?
我正在使用content_for和yeild将javascript文件注入我的布局底部,但我想知道包含内联javascript的最佳做法是什么.具体来说我想知道把脚本类型声明放在哪里:
<% content_for :javascript do %>
<script type="text/javascript"> ... </script>
<% end %>
Run Code Online (Sandbox Code Playgroud)
要么
<% content_for :javascript do %> ... <% end %>
<script type="text/javascript">
<%= yield :javascript %>
</script>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我现在正在使用第一个选项,并想知道包含多个是否不好
...一个视图中的声明.有时我会偏袒这一点.
我有一个部分,有一个布局:
<%= render :partial => 'home/mobile/home', :layout => 'home/mobile/page', :locals => {:page => 'abc2'}%>
Run Code Online (Sandbox Code Playgroud)
布局(page.html.erb)具有不同块的产量,例如:
<div data-role="header">
<%= yield :header %>
</div>
Run Code Online (Sandbox Code Playgroud)
但是,从不使用此yield块,而主级布局文件确实产生了预期的效果.
使用部分布局的命名content_for/yield块是不是不可能?有变通方法吗?
我希望继承 - content_for:header应首先在partial的布局中查找yield:标头,并且失败,即主布局文件.但这种情况并非如此.部分布局的yield:标头被简单地忽略.
我在我的应用程序中有大块的HTML,我想进入共享模板,然后使用content_for和yield来插入必要的内容.但是,如果我在同一个布局文件中多次使用它,则content_for只会附加到之前的那个想法不能很好地工作.这个问题有方法解决吗?
<div class="block side">
<div class="block_head">
<div class="bheadl"></div>
<div class="bheadr"></div>
<h2><%= yield :block_head %></h2>
</div>
<div class="block_content">
<%= yield :block_content %>
</div>
<div class="bendl"></div>
<div class="bendr"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
我使用以下代码设置块的内容
<%= overwrite_content_for :block_head do -%>
My Block
<% end -%>
<%= overwrite_content_for :block_content do -%>
<p>My Block Content</p>
<% end -%>
<%= render :file => "shared/_blockside" %>
Run Code Online (Sandbox Code Playgroud)
问题是如果我在同一布局上多次使用它,原始块中的内容将附加到辅助块
我已经尝试创建一个自定义帮助方法来解决它,但它不会返回任何内容
def overwrite_content_for(name, content = nil, &block)
@_content_for[name] = ""
content_for(name, content &block)
end
Run Code Online (Sandbox Code Playgroud)
我可能也会对此完全错误,如果有更好的方法可以让内容像我一样工作,我想知道.谢谢.
我试图在页面上输出一些内联js.我真的不想将它添加到任何JS文件,因为它是如此aribtrary和一次使用.话虽这么说,我正在使用haml并尝试使用content_for,以便在从布局加载jquery之后放置JS.
问题是haml不喜欢缩进的多行文本(我认为)
我正在尝试执行以下操作:
=content_for :javascript do
$(function(){
$("#sell_tickets_here").live("vclick",function(){
if($(this).is("checked"))
$("#tickets_here").display("inline");
else
$("#tickets_here").display("none");
});
});
Run Code Online (Sandbox Code Playgroud)
在我的布局中,我有:
= yield(:javascript)
Run Code Online (Sandbox Code Playgroud)
如果我在content_for语句后只有1行,那么哪个实际有效.
我正在测试我的rails 3.2应用程序中的content_for并遵循rails指南,但它们是特定于实际文件的,我似乎无法获得收益:
application.html.erb文件:
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<%= yield :navigation %> #shouldn't this load the content_for block named :navigation specified in the _main_nav.html.erb partial?
<%= yield %> #this load the index page content
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我创建了一个布局文件_main_nav.html.erb(我知道我可以使用<%= render'layouts/header'%>进行渲染,但我尝试使用content_for)_main_nav.html.erb是:
<% content_for :navigation do %>
<ul>
<li>Home</li>
</ul>
<% end %>
Run Code Online (Sandbox Code Playgroud)
他们以 这种方式阅读了RailsGuide http://guides.rubyonrails.org/layouts_and_rendering.html#using-the-content-for-method这应该有用.但事实并非如此.我没有收到错误.看似简单,但我很难过.
当我转到我的index.html.erb文件时,我希望看到这个结果:
使用 Rails 3.0.6,我发现在视图中,如果我执行
content_for :food_name, "Macaroni & Cheese"
Run Code Online (Sandbox Code Playgroud)
然后,当我使用 取回它时content_for(:food_name)
,就会已经将其&
制成&
。即使我做了 a 也没关系content_for(:food_name).html_safe
,它&
仍然已经制成了&
。
但如果按照以下方式完成,则不会转义:
content_for :food_name, "Macaroni & Cheese".html_safe
Run Code Online (Sandbox Code Playgroud)
在这种情况下,&
不会&
自动更改为。现在,因为有些地方我实际上做了 a#{h content_for(:food_name)}
并且它将被转义两次(成为&amp;
),或者
因为我在描述中有值,所以调用某些值而不调用其他值<meta>
会很奇怪h
。
另外,一个大问题是,如果它自动转义,如果我添加" - come see us!"
到它的末尾,并依靠 Rails 3 来转义它,那么现在, the&
被转义了两次。
在文档中content_for
:
http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for
我没有看到任何这样的描述。那么上面的描述是正确的还是文档更正确——事实上没有自动 HTML 转义?
从上面网页的源代码来看,似乎content_for
调用了capture
,并且执行了ERB::Util.html_escape
,所以实际上存在自动转义,但真的应该存在吗?为什么?是否也没有记录capture
自动转义?
我正在尝试使用yield
和创建动态内容content_for
.基本上我有一堆布局.我不想为每个布局创建一堆视图.我想在需要时渲染视图部件.对于代码的不同部分,它是可以的.但我有相同的部分与不同的内容有问题.
在我的 application.html.erb
<%= yield %>
<%= yield :name_section %>
Run Code Online (Sandbox Code Playgroud)
在我的show.html.erb
拥有;
<% content_for :name_section do %>
<b>Name:</b>
<%= @post.name %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这是个问题;
如果我想要多个具有不同内容的name_section,该怎么办?我的意思是; 我想:name_section
在不同的内容中放置不同的地方.
对于前
<table>
<tr>
<td>
<%= yield :name_section %>
</td>
</tr>
<tr>
<td>
<%= yield :name_section %>
</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢.Çağdaş
我正在尝试使用命名的yield块在我的应用程序页面中加载一些javascript,但代码是重复的,因为加载我的视图页面的通用yield.类似的东西:
-----代码出现在观点-----
<% content_for :bottom_scripts do %>
<script type="text/javascript">
Some Javascripts
</script>
<% end %>
Run Code Online (Sandbox Code Playgroud)
------我的申请页面中的代码-----
<div id = "body">
<%= yield %>
</div>
<%= yield :bottom_scripts %>
Run Code Online (Sandbox Code Playgroud)
脚本代码打印两次,但我需要它只是在第二次打印,任何想法?
content-for ×10
yield ×3
javascript ×2
ruby ×2
erb ×1
haml ×1
layout ×1
partial ×1
partials ×1
render ×1