ERB有条件地包括<%end%>标签

时间:2014-12-19 09:51:05

标签: ruby-on-rails ruby 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 (这可以适应我的工作情况如果我知道如何在&lt;%if%&gt;块中添加&lt;%end%&gt;

所以基本上,我认为我可以调整我的部分以有条件地包括<%= 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 %>

1 个答案:

答案 0 :(得分:3)

你应该传递给 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 %>

对于您的exaplained特定案例,请避免在表单外部呈现 _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 %>