/ / Jak prawidłowo dopuścić zero w szynach - ruby-on-rails

Jak poprawnie pozwolić zero na szynach - ruby ​​na szynach

W mojej aplikacji railsowej moje zespoły mają wiele imprez. W opinii zespołów może pokazać, jakie wydarzenia mają. Mój problem polega na tym, że jeśli zostanie utworzone nowe pasmo, wyrzuci błąd w widoku, ponieważ nie ma zdarzenia.

Czytałem o allow_nil i chciałem go użyć w moim modelu pasm, ale nie jestem pewien, jak to zaimplementować. Dokumentacja na ten temat jest dość sucha i niezbyt pomocna

class Band < ApplicationRecord
has_many :events :allow_nil true
end

Nie jestem pewien, czy powyższy sposób jest prawidłowy.

Odpowiedzi:

0 dla odpowiedzi № 1

Szyny 5.x

Myślę, że szukasz optional: true, ale musi zostać dodany w belongs_to strona stowarzyszenia, na przykład:

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

Rails 4.x

Rails 4 pozwala nil Domyślnie w każdym skojarzeniu wystarczy usunąć wymaganą weryfikację band_id obecność.


-1 dla odpowiedzi № 2

Podejrzewam, że to, o co prosisz (sprawdzanie poprawności danych na poziomie ActiveRecord w powiązanych modelach) nie jest w rzeczywistości twoim problemem. Twoje oryginalne pytanie dotyczy allow_nil ale stwierdzasz, że (z moim naciskiem):

W opinii zespołów może pokazać, jakie wydarzenia mają. Mój problem polega na tym, że jeśli zostanie utworzone nowe pasmo, wyrzuci błąd w widoku, ponieważ nie ma zdarzenia.

To, co prawdopodobnie robisz, to próba wyświetlenia listy zdarzeń przez iterację po nich za pomocą .each, ale ponieważ zbiór wydarzeń nie istnieje .each błędy. Zamiast tego, zanim to zrobisz:

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

Powinieneś to sprawdzić events.present?:

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

Jednak ze względu na kompletność allow_nil jest używany na określonych polach modelu, aby pominąć inne walidacje tego pola, jeśli to pole jest zerowe. ([Zobacz dokumentację tutaj.]) (http://edgeguides.rubyonrails.org/active_record_validations.html#allow-nil)

Nie działa w kodzie, który zamieściłeś w swoim pytaniu, ponieważ nie ma pliku event_id pole na twoim Band model - ponieważ jest to skojarzenie jeden do wielu Band do Events (zakładając, że poprawnie skonfigurowałeś bazę danych).