私は非常に特殊なレイアウトのテーマを使用しており、フォームをレールするためのフェイルセーフな方法を作りたかったのです。
レイアウトがあります 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>
そして、私は2つのパーシャルを持っています。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 %>
2番目の部分: 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
ます。しかし、2回目はコンテンツをクリアせず、追加Login Field
するだけです。
私はさらに複雑さを加えることを考えているlayout.html.erb
ので、それをインラインに保つことはオプションではありません。
content_forの「最新の」値を生成するためだけにレイアウトに指示する方法はありますか?
編集:
降伏後にフラッシュするメソッドを作成し、同じキーを再度使用することを提案しました。
def yield_and_flush!(content_key)
view_flow.content.delete(content_key)
end
解決策は、yield_and_flush!
メソッドを作成することでした。私はここで解決策を見ました
def yield_and_flush!(content_key)
view_flow.content.delete(content_key)
end
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加