【问题标题】:ERB conditionally include <% end %> tagERB 有条件地包含 <% end %> 标记
【发布时间】:2014-12-19 09:51:04
【问题描述】:

我想知道如何有条件地包含一个“结束”标签

我有很多像这样的“表单部分”

_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;%= form_for(@model) do |f| %&gt;

<%
# 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 %>

【问题讨论】:

  • 你想做什么?
  • 我强烈考虑走不同的路线;这将使关于页面/表单/部分的推理更加困难。
  • @Surya 好的,所以我有一些对应于同一模型的选项卡,但允许编辑不同的属性。以前,我为每个不同的选项卡设置一个表单,但后来我意识到这很愚蠢,因为只会保存与选项卡对应的参数。 (基本上,每个选项卡都有一个部分,每个选项卡都在调用其他部分......)
  • ... 而这些“其他部分”,也被完全不同的视图调用,有些视图期望部分定义“form_for”,其他视图已经定义了form_for,并通过生成的 f 变量到“其他部分”

标签: ruby-on-rails ruby erb


【解决方案1】:

您应该将参数传递给 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 %>

【讨论】:

  • 对不起,键盘问题让我在完成之前发布了...所以你说我实际上应该重写所有其他文件中的代码,以便在渲染部分之前调用&lt;%= form_for(something) do |f| %&gt;包含字段?
  • 这似乎是最干净的方法。
  • 否则,有朋友建议我可以做一个render_partial,部分只包含&lt;%= end %&gt;标签...
  • 完成。我希望它会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2019-03-27
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多