Данные 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'
в ваших моделях.
Если вы хотите изменить правило перегиба в этом случае, вы можете взглянуть на этот вопрос.