html - Rails 使用 content_for 并渲染相同的布局两次

标签 html ruby-on-rails layout ruby-on-rails-5

我使用的主题具有非常具体的布局,我想为您的 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>

我有两个部分。 第 1 部分: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“追加”了您提供的 block ,然后当我yield时返回整个 block 。

第一次,content_for(:field) 中没有任何内容,它会附加到电子邮件字段。但第二次它不会清除其内容,只是将 Login Field 附加到其中。

我正在考虑为 layout.html.erb 添加额外的复杂性,因此仅将其保持内联并不是一个选择。

有没有办法告诉布局只产生 content_for 的“最新”值。

编辑:

我编写了一个在yield后刷新的方法,表明将再次使用相同的 key :

def yield_and_flush!(content_key)
  view_flow.content.delete(content_key)
end

最佳答案

content_forflush 选项来重置以前的内容:

<% content_for :field, flush: true do %>
   new content here
<% end %>

关于html - Rails 使用 content_for 并渲染相同的布局两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58821250/

相关文章:

ruby-on-rails - OpsWorks 覆盖 database.yml/忽略自定义 JSON

java - Android:如何在自定义 AlertDialog 中检索 Edittext.getText()?

html - Outlook 2007/2010 用表格打破水平列

javascript - 滚动到 anchor JS 不起作用

javascript - 一次滑动 2 个 div?

javascript - AngularJS 指令类似于 Rails 助手

html - 在导航栏中对齐多个 div 的更优雅的方式?

ruby-on-rails - 未初始化的常量 Twilio::Rest Rails

android - 如何保持 TextView 正方形?

android - 将 TextView 放在右下角