2

ネストされた属性のセットを持つ 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

そのエラーをグーグルで検索しても、提案は得られませんでした。Rails Console から CreditCard オブジェクトを作成できますが、何らかの理由で Rails フォーム ジェネレーターがクラスを認識していません。

私はすでに simple_form_for を form_for (および関連する変更) に交換しようとしたので、それは simple_form の問題ではないと思います。

4

3 に答える 3

1

これは、データベースに関連付けられたテーブルがないモデルがある場合の問題のようです。ネストされたモデルをアプリケーションデータベーステーブルに格納するのではなく、外部サービスとの間で情報をフェッチおよび保存するという同じ状況が発生しています。

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

クレジットカード取引オブジェクトをローカルデータベースに保存したくありません。そして、あなたと同じ問題を抱えています。更新があれば投稿してください。

于 2012-04-12T19:26:55.440 に答える
1

これは、ユーザーとの関連付けにエラーがあるようです

于 2011-04-21T01:27:21.673 に答える