Данные Rails / проблема с перегибом

В моем приложении Rails 3.2.6 у меня есть модель, представляющая набор данных о виджете. На мой взгляд, правильное название для этого класса WidgetDataмножественное число, потому что у меня есть более одного элемента данных на виджет.

Если я попрошу Rails сгенерировать форму для этого класса:

= form_for @widget_data do |f|
  ...

Я получаю ошибку ActionView::Template::Error (undefined method 'widget_datum_path' ..., Предположительно, это из-за правила перегиба данных / данных в Rails.

Я не уверен, как лучше решить эту проблему: я могу позволить Rails диктовать, что моя модель должна быть WidgetDatum, Или я мог бы как-то отключить использование правила перегиба в этом конкретном случае, но я не уверен, как лучше это сделать. Совет приветствуется.

Предвидеть один возможный ответ: причина, по которой модель не просто называется Widget это то, что у меня уже есть класс фасадов, который представляет более богатый вид виджета, включающий оба WidgetData и другая информация.

2 ответа

Решение

Добавьте этот код в файл: config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|

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

 end

Чтобы ответить на ваш комментарий о "множественном числе, потому что у меня есть более одного элемента данных на виджет".

Идея состоит в том, что каждая строка данных виджета является своим собственным объектом. Active Record создаст один экземпляр WidgetData для каждой строки данных. Ваша таблица базы данных должна иметь имя (в соответствии с соглашением Rails) WidgetData, потому что таблица содержит много WidgetDatums. Но в Rails каждый ряд данных создается как отдельный объект на основе класса вашей модели. Это будет работать в любом случае, если вы правильно настроите свои интонации. Обычно я стараюсь делать это только при построении интерфейса на основе существующей модели данных. Но даже тогда вы поймете, что иногда лучше построить новую модель данных рельсов поверх существующей модели, используя self.table_name = 'old table name convention' в ваших моделях.

Если вы хотите изменить правило перегиба в этом случае, вы можете взглянуть на этот вопрос.

Другие вопросы по тегам