ERB 有条件地包含 <% 结束 %> 标签



我想知道如何有条件地包含"结束"标签

我有很多像这样的"表单部分">

_form_part_x.html.erb (但这不能适应我想做的事情(

<%= form_for(@model) do |f| %>
  <%= f.some_tag(...) %>
<% end %>

在很多视图中,我只需要渲染其中一个人。

现在,问题是我想为我的模型提供另一个大视图,在那里我渲染所有这些部分(form_part_1、form_part_2等(。就我而言,我使用的是引导选项卡,每个选项卡都是一个部分,反过来,它将调用多个部分form_part_x生成特定字段。

但是我不想在我的 HTML 中有多个表单标签,只有一个大表单,所以所有内容都同时保存。因此,在我render tabX之前,我编写代码来生成HTML标签,并在呈现所有选项卡后将其关闭。

simple_view.html.erb

<%= render 'form_part_x' %> 

big_view.html.erb

<%= form_for(something) do |f| %>
  <%= render 'tab1', f:f %>
  <%= render 'tab2', f:f %>
    ...
  <%= render 'tab5', f:f %>
<% end %>

_tab1.html.erb

<%= render 'form_part_10', f:f %>
<%= render 'form_part_23', f:f %>

_form_part_x.html.erb(如果我知道如何在 <%> 块中添加 <% 结尾 %>

所以基本上,我认为我可以调整我的部分以有条件地包含<%= form_for(@model) do |f| %>

<%
# These lines help determine whether an HTML `form` tag should be generated or not
f ||= false
if not f then
  existing_form = false
else
  existing_form = true
%>
<% if not existing_form %>
  # If the partial is called without sending a local f, we want to create the HTML `form` tag
  <%= form_for(something) do |f| %>
<% end %>
  <%= f.text_field(:some_field) %>
  <p>Many more stuff</p>
<% if not existing_form %>
  # If the partial is called without sending a local f, we want to CLOSE the newly created HTML `form` tag
  <!-- I need to add an <% end %> here !
<% end %>

您应该传递给表单构造的 form_special 参数:

_form_special.html.erb:

<%= form_for(something) do |f| %>
   <p>Many form-related stuff</p>
   <%- if case condition depending on the passed arguments as `params` %>
      <p>If case stuff: for example an additional `render_partial` </p>
   <%- end %>
<% end %>

其他观点:

<%= render partial: 'form_special', params: parameters %>

对于您解释的特定情况,只需避免在表单外部呈现 _form_part_x.html.erb 的情况,因此它将是:

<%= f.text_field(:some_field) %>
<p>Many more stuff</p>

和呼叫者视图:

<%= form_for(something) do |f| %>
   <%= render partial: form_part_x, f:f %>
<% end %>