用部分打破表格

Breaking a form with a partial

我有 rails 脚手架制作的表格:

<%= form_for(@archive) do |f| %>
  <% if @archive.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@archive.errors.count, "error") %> prohibited this archive from being saved:</h2>

      <ul>
      <% @archive.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :objective %><br>
    <%= f.cktext_area :objective %>
  </div>
  <div class="field">
    <%= f.label :settings %><br>
    <%= f.cktext_area :settings %>
  </div>
  <div class="field">
    <%= f.label :related_documents %><br>
    <%= f.cktext_area :related_documents %>
  </div>
  <div class="field">
    <%= f.label :responsability %><br>
    <%= f.cktext_area :responsability %>
  </div>
  <div class="field">
    <%= f.label :material_needed %><br>
    <%= f.cktext_area :material_needed %>
  </div>
  <div class="field">
    <%= f.label :description %><br>
    <%= f.cktext_area :description %>
  </div>
  <div class="field">
    <%= f.label :preventive_measures %><br>
    <%= f.cktext_area :preventive_measures %>
  </div>
  <div class="field">
    <%= f.label :corrective_actions %><br>
    <%= f.cktext_area :corrective_actions %>
  </div>
  <div class="field">
    <%= f.label :execution %><br>
    <%= f.cktext_area :execution %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

而且我想把字段分开,我想用partials因为它一直在重复,变化的是字段的名称,我想渲染一个字段的部分形式并传递字段名称。因为我要使用自定义的 ckeditor,并且我会在表单上不断重复,所以它可能会带来错误的机会。我这样想对吗?我的想法对吗?如果是这样,我该怎么做才能通过该领域?这会影响数据库中的某些内容吗? 我想做这样的事情。

形式:

<%= form_for(@archive) do |f| %>
  <% if @archive.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@archive.errors.count, "error") %> prohibited this archive from being saved:</h2>

      <ul>
      <% @archive.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

<%= render partial 'fields', 'field_name' %>

 <!-- Call many times and pass the field name -->

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

部分:

  <div class="field">
    <%= f.label :field_name%><br>
    <%= f.cktext_area :field_name %>
  </div>

您可能必须将 f 传递到部分...

<%= render partial 'fields', locals: { f: f } %>

您可以遍历要为其呈现部分字段的属性列表,并将当前迭代传递给部分:

<% %w(objective settings related_documents).each do |field| %>
    <%= render partial 'fields', locals: { f: f, field: field } %>
<% end %>

部分

<div class="field">
    <%= f.label field.to_sym %><br>
    <%= f.cktext_area field.to_sym %>
</div>

您可以在调用部分时传递各种参数。你可以这样做:-

<%= render partial 'fields', locals: { f: f, field_name: :body } %>

这里的 f 是表单对象,而 :body 将是调用部分时要传递的 field_name。

您甚至可以传递数组中的多个字段并在部分中迭代它们。

<%= render partial 'fields', locals: { f: f, field_names: [:body, :bio] } %>

您的部分代码将如下所示 -

<% field_names.each do |field_name| %>
    <div class="field">
        <%= f.label field_name%><br>
        <%= f.text_area :field_name %>
    </div>
<% end %>

你也可以在你的主文件中做同样的事情,而不是调用那么多的部分。因为这不被认为是一种好的做法。

我会用局部变量 (f) 和集合(field_name 符号)进行部分调用。

所以我会像这样在相应的操作中在我的控制器中创建一个数组。

编辑 实际上你可以创建一个之前的动作:before_action :field_names, only: [:new, :edit]

def field_names
  # %i creates an array of symbols
  @field_names = %i(objectives settings related_objects ...) 
end

然后在您的表格中您可以调用:

使用 "as:" 您现在可以访问 @fields_names 的实例 在每个部分调用 "field_name"

 <%= render partial: "fields", collection: @field_names, as: :field_name, 
 locals: {f: f} %> 

然后你可以在你的 _fields.html.erb

中插入 field_name 和 f
<div class="field">
 <%= f.label field_name %><br>
 <%= f.cktext_area field_name %>
</div>

collection 的聪明之处在于它会自动呈现与数组中的值相同的次数。

the guide

中的局部变量部分查找更多内容

祝你好运! :)

在我看来,更好的方法是自定义一个表单助手并执行如下操作:

<%= f.cktext_with_label :objective %>
<%= f.cktext_with_label :settings %>
<%= f.cktext_with_label :related_documents %>
<%= f.cktext_with_label :responsability %>
...

您创建一个名为 "cktext_with_label" 的新表单助手,然后创建您想要的字段,例如 div 容器。

你可以查看这个答案Custom form helpers