ERB是一个简单的Ruby模板系统,可以在任何纯文本文档中嵌入代码。它通常用于Web框架中的HTML生成(例如Ruby on Rails)。
如何在 Ruby on Rails 的视图中显示 HTML?
我有一个模块,应该根据用户角色呈现菜单。 我们曾经使用 cancancan gem,但自从我们有了新规范以来,它已被弃用。 我有一个类似......
收到用户的输入后,我得到一个像这样的字符串: str = "第一行/n第二行/n第三行" 当我尝试将其打印在我的 erb 文件中时,如下所示: <%= str %> 我越来越...
我想替换这段代码 --- myyaml: 我: :姓名:“约翰” 文字:| 我的名字是<% if me %><%= me[:name] %><% end %> --- 像这样的事情: --- myyaml: ...
我继承了一个项目,所以里面有很多javascript和jquery,我不明白最初的意图,所以请耐心等待我提出任何后续问题。 我有一个工具,您可以...
我正在尝试渲染部分集合,如下所示https://guides.rubyonrails.org/getting_started.html#rendering-partial-collections 我有一个包含一些帖子的个人资料。 这是个人资料视图,它...
有一个名为 TheForeman (v3.3.0) 的项目,我想用 spree/deface (v1.5.3) 覆盖一些 ERB 模板,例如 _management.html.erb,并在其末尾添加一些内容。 # 在应用程序中/
我需要为 post#show 和 picture#show 视图创建一个表单来为它们创建任何评论。我为这些创建了多态关联和迁移,但我需要帮助为它们创建表单......
我有一个需要阻塞的助手: def 容器(&块) 渲染(:partial => '布局/容器', :locals => {:content => capture(&block)}) 结尾 当我尝试在 &l...
如何使 ERB 或 ERUBI 在模板中转义 HTML,而不转义整个模板 - 不是 RAILS
我在 Rails 之外使用 ERB 或 ERUB 或 Tilt,我想让我的 HTML 模板像 Rails 一样工作,默认情况下,内容是 HTML 转义的。 例如 你好&l... 我在 Rails 之外使用 ERB 或 ERUB 或 Tilt,我想让我的 HTML 模板像 Rails 一样工作,默认情况下,内容是 HTML 转义的。 例如 <!-- file.html.erb --> <h1>Hello <%= name %></h1> 当我渲染它时,如果name是<b>Pat</b>,那么发送到浏览器的HTML是: <h1>Hello <b>Pat</b></h1> 我希望它能渲染这个: <h1>Hello <b>Pat</b></h1> 我希望在使用 <%= 时该行为成为默认行为。 我正在尝试倾斜,但是当我这样做时Tilt.new("file.html.erb",escape_html: true)它会转义整个文件,渲染<h1>Hello <b>Pat</b></h1> 我尝试阅读 Rails 的源代码来解决这个问题,但它是高度抽象的,我想知道是否有人阅读本文恰好知道如何实现这一点。 您可以为CGI::escapeHTML定义别名: <% def h(str); CGI::escapeHTML(str) end %> <h1>Hello <%=h "<b>Pat</b>" %></h1> 输出 <h1>Hello <b>Pat</b></h1>
Ruby 3.3 在使用 ruby -c 语法检查时引入了yield 错误
我使用 erb 和 ruby -c 来检查 erb 文件的语法。 我是怎么做的: 猫布局.html.erb | erb -x -T '-' | erb -x -T '-' |红宝石-c 例如这个layout.html.erb文件: <%= ... 我使用 erb 和 ruby -c 来语法检查 erb 文件。 我是怎么做的: cat layout.html.erb | erb -x -T '-' | ruby -c 例如这个layout.html.erb文件: <div class="container"> <%= yield %> </div> 直到ruby 3.2它一直有效,这意味着 # ruby 2.5, ruby 2.7.2, ruby 3.2 cat layout.html.erb | erb -x -T '-' | ruby -c # => Syntax OK 但是引入 ruby 3.3 我们得到一个错误: # ruby 3.3 cat layout.html.erb | erb -x -T '-' | ruby -c # => -:3: Invalid yield # => ; _erbout.<<(( yield ).to_s); _erbout.<< "\n".fre... # => -: compile error (SyntaxError) 现在我通过使用 yield: 删除包含 grep -v yield 的行来解决这个问题 cat layout.html.erb | grep -v yield | erb -x -T '-' | ruby -c 你能想到一种不同的语法检查包含 ruby 3.3 的 yield erb 文件的语法吗? ruby 3.3.0 引入 prism 作为新的解析器。根据 这些 问题,解析器存在与 yield 相关的问题,该问题应该在 prism 版本 0.27.0 中得到解决。 如果您的prism版本较旧,您可以使用进行更新 gem update prism
假设我有一个对象,它有一些带有默认值的属性。我在模型级别设置了这些属性的默认值,如下所示...... 初始化后:设置默认值 def 设置默认值 ...
<%= form.field_container :name do %> <%= form.label :name, raw('Name' + content_tag(:span, ' *', :class => '必需')) %> <%= form.text_field :n... <div class='row'> <%= form.field_container :name do %> <%= form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) %> <%= form.text_field :name, :class => 'fullwidth' %> <%= form.error_message_on :name %> <% end %> </div> 为什么会产生以下错误? $ erb -x -T - test.erb | ruby -c -:3: syntax error, unexpected ')' ...form.field_container :name do ).to_s); _erbout.concat "\n" ... ^ -:9: syntax error, unexpected $end, expecting ')' 如果你看一下erb -x -T - test.erb输出的代码: #coding:ASCII-8BIT _erbout = ''; _erbout.concat "<div class='row'>\n " ; _erbout.concat(( form.field_container :name do ).to_s); _erbout.concat "\n" ; _erbout.concat " "; _erbout.concat(( form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) ).to_s); _erbout.concat "\n" ; _erbout.concat " "; _erbout.concat(( form.text_field :name, :class => 'fullwidth' ).to_s); _erbout.concat "\n" ; _erbout.concat " "; _erbout.concat(( form.error_message_on :name ).to_s); _erbout.concat "\n" ; _erbout.concat " "; end ; _erbout.concat "\n" ; _erbout.concat "</div>\n" ; _erbout.force_encoding(__ENCODING__) 您可以看到,在第三行,do后面跟着一个)。 Ruby 期待一个 do…end 块,但得到一个右括号。这是语法错误的直接原因。 erb输出错误代码的原因是你在应该使用<%=时使用了<%。将代码更改为此可以修复语法错误: <div class='row'> <% form.field_container :name do %> <%= form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) %> <%= form.text_field :name, :class => 'fullwidth' %> <%= form.error_message_on :name %> <% end %> </div> 我无法运行此代码来测试它在更改后是否输出应有的内容,但由 erb 生成的代码看起来可以工作: #coding:ASCII-8BIT _erbout = ''; _erbout.concat "<div class='row'>\n " ; form.field_container :name do ; _erbout.concat "\n" ; _erbout.concat " "; _erbout.concat(( form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) ).to_s); _erbout.concat "\n" # more... 编辑 由于这个解决方案显然确实破坏了输出,我研究了mu太短的建议。我检查了 Erubis(Rails 3 默认使用)的行为是否与 ERB 不同。 erubis -x -T - test.erb输出的代码(原始的、未经编辑的test.erb): _buf = ''; _buf << '<div class=\'row\'> '; _buf << ( form.field_container :name do ).to_s; _buf << ' '; _buf << ' '; _buf << ( form.label :name, raw('Name' + content_tag(:span, ' *', :class => 'required')) ).to_s; _buf << ' '; _buf << ' '; _buf << ( form.text_field :name, :class => 'fullwidth' ).to_s; _buf << ' '; _buf << ' '; _buf << ( form.error_message_on :name ).to_s; _buf << ' '; end _buf << '</div> '; _buf.to_s 第三行有完全相同的问题,并且erubis -x -T - test.erb | ruby -c输出相同的语法错误。所以 ERB 和 Erubis 之间的差异可能不是问题所在。 我还尝试对这段代码进行语法检查来自官方Rails文档: <%= form_for(zone) do |f| %> <p> <b>Zone name</b><br /> <%= f.text_field :name %> </p> <p> <%= f.submit %> </p> <% end %> 它得到相同的语法错误。所以这并不是说你的ERB代码写得不好;而是你的ERB代码写得不好。您的代码与该示例非常相似。 此时我最好的猜测是 erb 的 -x 标志(它将 ERB 模板转换为 Ruby 代码而不是直接对其进行评估)是有缺陷的,并且不支持一些它应该支持的功能。虽然现在我想起来了,但当你输出一个本身输出文本的块的结果时,我很难想象到底应该输出什么 Ruby 代码。应在什么时间写入每个输出 – 首先是结果,还是首先是块内容? 简短版:没有什么问题; Rails 做了一些疯狂的事情。 长版:你只能做 <%= some_method do %> <% end %> (即,将 <%= 与块一起使用)因为 Rails 中存在巨大的飞行黑客。 <%= %> 的内容应该是一个独立的表达式(或多个表达式):您应该能够将其粘贴到 eval 中并使其在语法上有效。 在 Rails 3 之前,人们有时会对“普通助手”(link_to、number_to_currency等)感到困惑,必须使用 <%=,但是当使用这些助手或助手的块形式时就像form_for一样,你必须使用<%。这就是为什么 Rails 3 制作了 <%= 支撑块。 要处理这种情况下的块,当您使用 <%= 时,Rails 会查看 ERB 代码,使用正则表达式查看它是否看起来像块,如果确实如此,则会立即重写生成的代码以将其转换为有效的红宝石。 精彩博客文章“Rails 3 中的块助手”中有更多血淋淋的细节。 我能够为 ERB 和 Sinatra 解决这个问题。视图中有一个名为 @_out_buf 的实例变量。所以我们有 module Sinatra module ViewHelper def form(action, method, **options) serialized_options = options.map { |k, v| "#{k}=\"#{v}\"" }.join(' ') @_out_buf << <<-HTML <form action="#{action}" method="#{method}" #{serialized_options}> #{yield if block_given?} </form> HTML end end helpers ViewHelper end 然后 class HomeController < ApplicationController helpers Sinatra::ViewHelper get '/' do erb :'home/index' end end 和 <% form('/auth/logout', 'post', class: "nav-item") do %> <input type="hidden" name="_method" value="DELETE"> <button type="submit" class="nav-link border-0 bg-transparent">Logout</button> <% end %> 我花了几个小时在这上面,所以我希望当我以后忘记它时它能对我有所帮助。
我正在使用 ERB 生成一组带有位置数据的指令,并希望接受输入中的偏移量。然而,当我尝试检查该偏移量是否存在时,它将其值设置为零。如果...
我正在渲染一个带有数字字段的简单表单,尝试使用变量设置该字段的初始值。如果我在 ERB 模板中使用常量,它会呈现 - 如果我从变量设置值...
我正在尝试遵循 Rails 入门指南来设置我的项目,但在设置嵌套模型/控制器/视图时遇到了问题。 我有活动模型和拒绝模型,
我正在使用 nanoc 为我的项目生成文档。我已经创建了几个文件(~50)和布局,但目前我正在处理一个文件。奇怪的是它编译了这个
Rails 中的 Bootstrap + Simple Form 验证失败,但字段没有变成红色
我研究了一下,还有另一个具有相同标题的问题,但解决方案没有帮助/适用。 问题:尽管验证在保存对象时失败,simple_form 中的字段不会变成红色 - 我...
我创建了一个简单游戏,同时拥有控制器和视图。 这是我的功能: 定义分数 @字母=参数[:字母] @word = params[:word].upcase if !compsrison?(@word.split(''), @
我正在使用(主要)部分: <%= render partial: 'shared/page/head' %> 它利用了其他(次要)部分: <%= render partial: 'shared/page/head/title' %>...
就这么简单 需要“erb” a =“això és una merda <%=rand(1..20)%>” c = {"id" => "això és una merda <%=rand(1..10)%>"} 如果您运行 ERB.new(a).result,...