4 votes

Erreur d'utilisation de la gemme nested_form avec une association vide

Dans mon application rails, j'ai deux modèles, une ClientPage y un ContentSection , donde ClientPage has_many :content_sections . J'utilise le nested_form gem aux deux modèles à éditer avec le même formulaire. Cela fonctionne bien tant que la ClientPage a au moins un ContentSection mais s'il n'y a pas d'association ClientSections l'utilisation nested_form 's link_to_add rejette l'erreur suivante NoMethodError :

undefined method `values_at' for nil:NilClass

Le formulaire est structuré comme suit :

<%= nested_form_for page, form_options do |f| %>
  # ClientPage fields

  # ClientSections

  <%= f.link_to_add "Add new section", :content_sections %>
<% end %>

Tant qu'il y a au moins un ClientSection associé à la page, cela fonctionne bien. Dès qu'il n'y en a pas, l'erreur est déclenchée. En supprimant le link_to_add empêche également l'erreur d'être déclenchée. (Il existe en fait un second modèle imbriqué sous le nom de ContentSection et le même problème se pose s'il n'y a pas de modèles associés).

Je ne suis pas sûr de ce qui m'échappe, mais toute indication ou suggestion serait grandement appréciée.

6voto

Zaid Crouch Points 2280

J'ai finalement trouvé la solution : l'erreur était due au fait que j'utilisais la gemme d'une manière légèrement non standard. Dans le formulaire, au lieu de rendre toutes les sections du contenu de la manière standard :

<%= f.fields_for :content_sections do |section_form| %>
  # section fields
<% end %>

Je l'ai placé dans une boucle, car j'avais besoin de l'index de chaque élément (qui n'est pas stocké dans le modèle lui-même) :

<% page.content_sections.each_with_index do |section, index| %>
  <%= f.fields_for :content_sections, section do |section_form| %>
    # section fields
  <% end %>
<% end %>

Le problème en procédant de cette façon est que le fields_for n'est pas appelée si l'association est vide, et de ce fait, la gemme ne peut pas construire le blueprint de l'objet (qui est utilisé pour ajouter l'élément supplémentaire lorsque l'association est vide). link_to_add est appelé).

La solution était de s'assurer fields_for est appelé même si l'association est vide :

<% if page.content_sections.empty? %>
  <%= f.fields_for :content_sections do |section_form| %>
    # section fields
  <% end %>
<% end %>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X