Ошибка формы Rails 3: "неопределенный метод` quoted_table_name '" - PullRequest
2 голосов
/ 21 апреля 2011

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

<%= 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

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

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

Ответы [ 3 ]

1 голос
/ 12 апреля 2012

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

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

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

1 голос
/ 21 апреля 2011

Кажется, ошибка в ассоциации с пользователем

0 голосов
/ 02 июля 2012

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

...