/ / Comment autoriser correctement nil dans les rails - ruby-on-rails

Comment autoriser correctement zéro dans les rails - Ruby-on-rails

Dans mon application de rails, mes groupes organisent de nombreux événements. Du point de vue des groupes, il peut montrer quels événements ils ont. Mon problème est que si un nouveau groupe est créé, il lancera une erreur dans la vue car il n'a pas d'événement.

Je lisais sur allow_nil et je voulais l'utiliser dans mon modèle de bandes mais je ne sais pas comment l'implémenter. La documentation à ce sujet est assez sèche et pas vraiment utile

class Band < ApplicationRecord
has_many :events :allow_nil true
end

Je ne sais pas si la façon ci-dessus de le faire est correcte.

Réponses:

0 pour la réponse № 1

Rails 5.x

Je pense que tu cherches optional: true, mais il doit être ajouté dans le belongs_to côté de l'association, comme ceci:

class Event < ApplicationRecord
belongs_to :band, optional: true
end

Rails 4.x

Rails 4 permet nil par défaut sur toute association, il vous suffit de supprimer toute validation qui nécessite band_id présence.


-1 pour la réponse № 2

Je soupçonne que ce que vous demandez (validations de données au niveau ActiveRecord sur les modèles associés) n'est pas réellement votre problème. Votre question initiale concerne allow_nil mais vous dites que (en insistant sur le mien):

Du point de vue des groupes, il peut montrer quels événements ils ont. Mon problème est que si un nouveau groupe est créé, il lancera une erreur dans la vue car il n'a pas d'événement.

Vous essayez probablement d’afficher une liste d’événements en les parcourant à l’aide de .each, mais puisque la collection d'événements n'existe pas .each erreurs. Au lieu de cela, avant de le faire:

<% events.each do |event| %> # or similar code that you"re using
...                       # to iterate over the collection
<% end %>

Tu devrais vérifier ça events.present?:

<% if band.events.present? %>
<% band.events.each do |event| %>
...
<% end %>
<% else %>
# show something else
<% end %>

Par souci d'exhaustivité cependant, allow_nil est utilisé sur des champs spécifiques d'un modèle pour ignorer d'autres validations sur ce champ si ce champ est nul. ([Voir la documentation ici.]) (http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil)

Cela ne fonctionne pas dans le code que vous avez publié dans votre question car il n'y a pas de event_id champ sur votre Band modèle — puisqu'il s'agit d'une association un-à-plusieurs de Band à Events (en supposant que vous configuriez correctement votre base de données).