Stworzenie pola select z ilością miesięcy

Witam.
Mam taki problem:
Chciałbym w formularzu tworzenia nowego obiektu stworzyć DropDown listę z ilością miesięcy np:
1 miesiąc
2 miesiące
3 miesiące
6 miesięcy
Jeśli ktoś wybierze np. 2 miesiące to przeliczy to na dni, czyli 2 * 30 dni(zakładam, że każdy miesiąc to 30 dni).
Następnie od dnia dzisiejszego doda tą ilość dni i zapisze w poli end_on.
Schemat tabeli:

Table name: bought_details

#
#  id            :integer          not null, primary key
#  bought_data   :date             not null
#  start_on      :date
#  end_on        :date             not null
#  entry_type_id :integer
#  person_id     :integer

To co już zrobiłem:

  1. Stworzyłem metodę w modelu ustawiającą dzisiejszą datę:

    def set_bought_data

    self.bought_data = Date.today
  end
  1. Dodałem before_save :set_bought_data
  2. W formularzu new dodałem taką linijkę:

= f.select :days, [[‘1 miesiąc’, 30], [‘2 miesiąc’, 60], [‘3 miesiąc’, 90]]

  1. W modelu dodałem metodę razem z before save:

def set_end_on
self.end_on = Date.today + days
end

  1. W modelu mam dodany attr_accessor :days
    Formularz z select się nie wyświetla(pozostałe pola tak). Co robię żle, jak to naprawić?

@Lukis92 Zacząłbym od sprawdzenia w inspektorze / źródle strony czy ww. select występuje w DOM, może zwyczajnie jest ukryty w wyniku działania jakiś styli. Jeśli nie to przejrzyj dokładnie formularz, sprawdź czy przypadkiem select nie wylądował omyłkowo w jakimś warunku lub czy nie masz <% zamiast <%= jeśli używasz ERB albo - zamiast = jeśli używasz HAML.

Ogólnie do wyświetlenia tego selecta powinna wystarczyć sama modyfikacja formularza i modelu które podałeś (f.select i attr_accessor). Z ciekawości nawet sprawdziłem tą sytuację u siebie w świeżym projekcie (Rails 4) i problem nie występuje, dlatego podejrzewam CSS / JS lub jakiś warunek w szablonie formularza.

1 Like

@clk miałeś rację to styl css ukrywał mi select. Dzięki za pomoc. Okazało się równieź, że nie przekazywałem w paramsach :days (ciągle o tym zapominam). Oraz, że w metodzie set_end_on trzeba sparsować days na int.

  def set_end_on
    self.end_on = Date.today + days.to_i
  end