html - Rails 使用 content_for 并两次渲染相同的布局
问题描述
我正在使用一个具有非常特定布局的主题,并且我想为您的 Rails 表单提供一种故障安全方式。
我有一个布局app/views/shared/forms/fields/_layout.html.erb
<div class="js-form-message mb-4">
<div class="js-focus-state input-group u-form">
<div class="input-group g-brd-primary--focus">
<%= yield(:field) %>
</div>
</div>
</div>
我有两个部分。第一部分:app/views/shared/forms/fields/_email.html.erb
<% form = locals[:form] %>
<% locals[:required] = locals[:required].nil? ? true : locals[:required] %>
<% locals[:placeholder] = locals[:placeholder] || t('forms.shared.email.placeholder') %>
<%= render layout: "shared/forms/fields/layout", locals: locals do %>
<% content_for(:field) do %>
<%= form.email_field :email,
placeholder: locals[:placeholder],
class: "form-control g-py-15 g-px-15",
"data-error-class"=>"u-has-error-v1-3",
"data-success-class"=>"u-has-success-v1-2",
"data-msg-email" => t('forms.shared.email.validate'),
"data-msg" => t('forms.shared.required'),
autofocus: locals[:autofocus],
required: locals[:required] %>
<% end %>
<% end %>
第二部分:app/views/shared/forms/fields/_login.html.erb
<% form = locals[:form] %>
<% locals[:required] = locals[:required].nil? ? true : locals[:required] %>
<% locals[:placeholder] = locals[:placeholder] || t('forms.shared.login.placeholder') %>
<%= render layout: "shared/forms/fields/layout", locals: locals do %>
<% content_for(:field) do %>
<%= form.email_field :login,
placeholder: locals[:placeholder],
class: "form-control g-py-15 g-px-15",
"data-error-class"=>"u-has-error-v1-3",
"data-success-class"=>"u-has-success-v1-2",
"data-msg" => t('forms.shared.required'),
autofocus: locals[:autofocus],
required: locals[:required] %>
<% end %>
<% end %>
当我这样做时:
<%= render "shared/forms/fields/email", locals: {form: f} %>
<%= render "shared/forms/fields/login", locals: {form: f} %>
我明白了
Email Field
Email Field/Login Field
我发现content_for
“附加”了你给它的块,然后当我yield
返回整个块时。
第一次没有任何东西content_for(:field)
,它附加到它Email Field
。但第二次它并没有清除它的内容,只是附加Login Field
到它上面。
我正在考虑增加额外的复杂性,layout.html.erb
所以仅仅保持内联不是一种选择。
有没有办法告诉布局只产生 content_for 的“最新”值。
编辑:
我写了一个在 yield 后刷新的方法,建议将再次使用相同的密钥:
def yield_and_flush!(content_key)
view_flow.content.delete(content_key)
end
解决方案
content_for
可以flush
选择重置以前的内容:
<% content_for :field, flush: true do %>
new content here
<% end %>
推荐阅读
- python - 在 Windows 上使用 Anaconda 进行 pytest githook
- javascript - 正则表达式匹配来自 url 的图像 id
- ios - 自定义绘图 UIView 在 iOS 9 上崩溃但在其他系统上工作
- node.js - 如何通过云功能删除所有匿名用户?
- javascript - 使用 Ajax POST 请求将数据发送到 Flask 后端
- angular - 角业力茉莉花日期比较
- java - Elasticsearch 排序 - 没有得到预期的结果
- html - 如何添加 X 微调型汉堡菜单
- xmpp - XMPP:如何在客户端之间发送自定义消息?
- python - 基于当前行和上一行的用户定义函数