Ошибка формы Rails 3: неопределенный метод `quoted_table_name'

У меня есть форма Rails 3 (на самом деле, простая форма), которая имеет набор вложенных атрибутов:

<%= simple_form_for(@user, :url => the_path(@user)) do |f| %>
  ...
  <%= f.simple_fields_for :credit_card do |c| %>
    <%= c.input :number, :label => 'Credit card number' %>
      ...
  <% end %>
...
<% end %>

Проблема в том, что атрибуты :credit_card принадлежат классу CreditCard, который не является моделью, поскольку я не храню данные кредитной карты в базе данных. У меня есть этот класс, определенный в /app/models/credit_card.rb следующим образом (согласно этот RailsCast):

class CreditCard
  include ActiveModel::Validations
  include ActiveModel::Conversion
  include ActiveModel::Naming

  attr_accessor :number, :expiration_month, :expiration_year, :cvv

  validates_presence_of :number, :expiration_month, :expiration_year, :cvv

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def persisted?
    false
  end
end

В user.rb у меня есть это:

  has_one :credit_card
  accepts_nested_attributes_for :credit_card

Когда я захожу на страницу, я получаю эту ошибку:

undefined method `quoted_table_name' for CreditCard:Class

Поиск в Google этой ошибки не дал никаких предложений. Я могу создавать объекты CreditCard из консоли Rails, но по какой-то причине генератор форм Rails не видит класс.

Я уже пытался заменить simple_form_for на form_for (и связанные с этим изменения), поэтому я не думаю, что это проблема simple_form.


person Devin    schedule 20.04.2011    source источник
comment
Как выглядит код вашего контроллера? Вы не сможете спасти пользователя, у которого есть кредитная карта... вот где это ломается.   -  person Jesse Wolgamott    schedule 21.04.2011
comment
Я даже до сохранения еще не дошел. Эта ошибка появляется при попытке загрузить форму. Я полагаю, мне просто нужно добавить несколько дополнительных полей формы, которые не являются вложенными.   -  person Devin    schedule 21.04.2011
comment
Я не думаю, что у вас вообще должен быть пользователь. Просто имейте форму для кредитной карты   -  person Jesse Wolgamott    schedule 21.04.2011
comment
Модель пользователя также действует как аутентичная и хранит контактную информацию и информацию о доставке, поэтому мне это нужно. Я просто хотел добавить эти дополнительные поля CC для использования с нашим платежным шлюзом. А пока я просто удалю немодельный класс CreditCard и добавлю туда несколько дополнительных полей формы с помощью attr_accessor.   -  person Devin    schedule 21.04.2011
comment
Вы можете предварительно заполнить контакт/доставку на кредитной карте. Но вы не можете иметь вложенные_атрибуты_для модели, не поддерживаемой базой данных.   -  person Jesse Wolgamott    schedule 21.04.2011


Ответы (3)


Это кажется ошибкой в ​​ассоциации с пользователем

person rafaelfranca    schedule 21.04.2011

Кажется, это проблема с моделью без связанной таблицы в базе данных. У меня такая же ситуация, когда я не хочу хранить вложенную модель в таблице базы данных приложения, а скорее извлекать и сохранять информацию во внешнюю службу и из нее.

class Order < ActiveRecord::Base
  attr_accessor :identifier, :amount
  has_one :credit_card_transaction
end

class CreditCardTransaction
  attr_accessor :number, :expiration_date
  belongs_to :order
end

Я не хочу сохранять объект транзакции кредитной карты в локальной базе данных. И получить ту же проблему, что и вы. Пожалуйста, следите за обновлениями.

person Sulabh Jain    schedule 12.04.2012

Это может быть случай наличия другого класса с тем же именем «CreditCard», что в этом случае класс не является ActiveRecord и, следовательно, не имеет метода quoted_table_name.

person ibrahim    schedule 02.07.2012