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

我使用的主题具有非常特殊的布局,我想以一种故障转移的方式来保护表单。

我有一个布局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,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
jiangpingshe 回答:Rails使用content_for并两次渲染相同的布局

b具有content_for选项来重置以前的内容:

flush
,

解决方案是编写一个yield_and_flush!方法。我看到了解决方法here

def yield_and_flush!(content_key)
  view_flow.content.delete(content_key)
end
本文链接:https://www.f2er.com/3116477.html

大家都在问