Проблема перегиба данных/датума 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, так и другую информацию.


person Ian Dickinson    schedule 25.06.2012    source источник


Ответы (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, потому что таблица содержит много WidgetDatum. Но в Rails каждая строка данных создается как отдельный объект на основе класса вашей модели. Это будет работать в любом случае, если вы правильно настроите интонации. Обычно я пытаюсь сделать это только при построении интерфейса на основе существующей модели данных. Но даже тогда вы поймете, что иногда лучше создать новую модель данных rails поверх существующей модели, используя self.table_name = 'old table name convention' в ваших моделях.

person OpenCoderX    schedule 25.06.2012
comment
Вероятно, это должно быть inflect.irregular 'widget_data' - person 0x4a6f4672; 13.02.2014

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

person cdesrosiers    schedule 25.06.2012
comment
Спасибо. Я искал ТАК ответы, прежде чем публиковать свой вопрос; твои навыки поиска явно превосходят мои! - person Ian Dickinson; 25.06.2012