2012-06-25 7 views
6

W mojej aplikacji Rails 3.2.6 mam model reprezentujący kolekcję danych o widżecie. Moim zdaniem poprawna nazwa dla tej klasy to WidgetData, liczba mnoga, ponieważ mam więcej niż jeden element danych na widget.Problem z wymianą danych i danych w szynie

Jeśli pytam Rails wygenerować formularz dla tej klasy:

= form_for @widget_data do |f| 
    ... 

pojawia się błąd ActionView::Template::Error (undefined method 'widget_datum_path' .... Prawdopodobnie wynika to z reguły odmienności danych/danych Rails.

Nie jestem pewien, jak najlepiej rozwiązać ten problem: mogłem pozwolić Railsom na dyktowanie, że mój model powinien być w rzeczywistości WidgetDatum. Mogłem też w jakiś sposób wyłączyć wykorzystanie reguły fleksji w tym konkretnym przypadku, ale nie jestem pewien, jak najlepiej to zrobić. Rada mile widziane.

Aby przewidzieć jedną możliwą odpowiedź: powodem, dla którego model nie jest nazywany tylko Widget jest to, że mam już klasę elewacji o nazwie, która przedstawia bogatszy widok widżetu obejmującego zarówno WidgetData, jak i inne informacje.

Odpowiedz

10

Dodaj ten kod do pliku „mnogiej, bo mam więcej niż jeden element danych na widget” config/inicjalizatory/inflections.rb

ActiveSupport::Inflector.inflections do |inflect| 

    inflect.irregular 'widgetdata', 'widgetdatas' # or whatever you want your plural to be 

end 

Aby rozwiązać swój komentarz na

Chodzi o to, że każdy wiersz danych widgetu jest jego własnym obiektem. Rekord aktywny utworzy jedno wystąpienie widgetu WidgetData dla każdego wiersza danych. Twoja tabela bazy danych powinna mieć nazwę (zgodnie z konwencją Rails) WidgetData, ponieważ tabela zawiera wiele WidgetDatums. Ale w Railsach każdy wiersz danych jest tworzony jako pojedynczy obiekt oparty na klasie twojego modelu. Będzie działać tak samo długo, jak długo konfigurujesz swoje przegięcia. Zwykle próbuję to zrobić tylko podczas budowania interfejsu na istniejącym modelu danych. Ale nawet wtedy zdasz sobie sprawę, że czasami lepiej jest zbudować nowy model danych szyn na szczycie istniejącego modelu, używając w swoich modelach self.table_name = 'old table name convention'.

+0

To prawdopodobnie musi być inflect.irregular "widget_data" – 0x4a6f4672

1

Jeśli chcesz zmienić regułę fleksji w tym przypadku, możesz rzucić okiem na this question.

+0

Dzięki. Szukałem odpowiedzi na pytania przed wysłaniem pytania; Twoje umiejętności wyszukiwania są wyraźnie lepsze od moich! –

Powiązane problemy