2017-07-05 1 views
0

Je cette forme partielle faite par des rails échafaudage:Briser une forme avec un

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

Et je voulais séparer les champs, je voulais utiliser partials parce qu'il ne cesse de répéter, ce qui change est le nom du champ, je voulais rendre la forme partielle d'un champ et passer le nom du champ. En raison du fait que je vais utiliser le ckeditor personnalisé, et je vais continuer à répéter sur le formulaire, cela peut donner l'erreur. Ai-je raison de penser cela? Est-ce que mon idée est correcte? Si oui, comment puis-je faire pour passer le champ? Cela influencera-t-il quelque chose dans la base de données? Je voulais faire quelque chose comme ça.

forme:

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

partielle:

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

Répondre

0

Je ferais un appel partiel avec les locals (f) et une collection (field_name symbols).

Donc je créerais un tableau dans mon contrôleur dans l'action correspondante comme ceci.

ModifierEn fait, vous pouvez créer une avant l'action: before_action :field_names, only: [:new, :edit]

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

Et puis dans votre formulaire, vous pouvez appeler:

Avec le "comme:" vous pouvez maintenant accéder à un instance des @fields_names appelé "nom_de_champ" dans chaque partie

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

Et vous pouvez INSET field_name et f dans votre _fields.html.erb

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

La chose intelligente à propos collection est qu'il rend automatiquement le même nombre de fois qu'il ya des valeurs dans le tableau.

Rechercher plus dans la section des variables locales dans the guide

Bonne chance! :)

0

Vous avez probablement passer f dans la partie ...

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

Vous pourriez peut-être sur une liste itérer des attributs que vous voulez rendre vos champs partiels pour et passer l'itération courante dans la partie:

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

partielle

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

Que serait ce f: f? Pouvez-vous s'il vous plaît utiliser un exemple en passant un: corps? –

+0

Je vais modifier ma réponse – Eric

0

Vous pouvez passer plusieurs arguments lors de l'appel d'une partie. Vous pouvez faire quelque chose comme ceci: -

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

Ici f est l'objet de la forme et: le corps sera le field_name vous voulez passer lors de l'appel partiel.

Vous pouvez même passer plusieurs champs dans un tableau et les parcourir dans le tableau partiel.

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

Votre code partiel ressemblera à quelque chose comme ça -

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

Vous pouvez faire la même chose dans votre fichier principal aussi au lieu d'appeler tant de partails. Comme cela n'est pas considéré comme une bonne pratique.

0

Une meilleure approche à ce à mon humble avis est de personnaliser un assistant formulaire et faire quelque chose comme ceci:

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

Vous créez une nouvelle forme aide appelée « cktext_with_label » alors que créer les champs comme vous voulez, même le conteneur div par exemple.

Vous pouvez vérifier cette réponse Custom form helpers