打破一个部分的形式

时间:2017-07-05 17:28:59

标签: ruby-on-rails ruby forms render partial

我有这个由rails scaffold制作的表格:

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

4 个答案:

答案 0 :(得分:0)

您可能必须将var digitArry = ['9', '8', '7', '4', '5', '6']; var integer = +digitArry.join(''); console.log(integer);传递给部分...

f

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

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

部分

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

答案 1 :(得分:0)

调用partial时可以传递各种参数。你可以这样做: -

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

这里f是表单对象,并且:body将是调用partial时要传递的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 %>

您也可以在主文件中执行相同的操作,而不是调用那么多的partails。因为它不被认为是一种好的做法。

答案 2 :(得分:0)

我会使用locals(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

然后在您的表单中,您可以致电:

使用&#34; as:&#34;您现在可以访问@fields_names的实例 叫&#34; field_name&#34;在每个部分

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

中的局部变量部分中查找更多内容 祝你好运! :)

答案 3 :(得分:0)

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

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

您创建了一个名为&#34; cktext_with_label&#34;的新表单助手。然后创建你想要的字段,甚至是div容器。

您可以查看此答案Custom form helpers