1

私は Rails の初心者で、ネストされたモデルを含むサインアップ フォームを作成しています。フォームを送信すると、ユーザーは問題なく保存されますが、ネストされたモデルはサブスクリプション データベースに何も保存せず、コンソールはエラーをスローしません。

非常に明白な何かを見逃していないことを心から願っています。また、共有できるヒントをいただければ幸いです。ありがとう!

ここにコードがあります-

モデル:

class Plan < ActiveRecord::Base
  attr_accessible :posts, :name, :price
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :plan
  has_many :events
  has_one :subscription, :autosave => true

  accepts_nested_attributes_for :subscription

  attr_accessible :subscription_attributes

  def save_with_payment
    if valid?
    customer = Stripe::Customer.create(
      email:email, 
      plan: plan_id,
      card: stripe_card_token )
    self.stripe_customer_token = customer.id
    save!
  end
  rescue Stripe::InvalidRequestError => e
    logger.error "Stripe error while creating customer: #{e.message}"
    errors.add :base, "There was a problem with your credit card."
    false
  end
end

class Subscription < ActiveRecord::Base
  attr_accessible :plan_id, :status, :user_id
  belongs_to :user

end

これはユーザーコントローラーです:

def new
  @user = User.new
  plan = Plan.find(params[:plan_id])
  @user = plan.user
  @user.build_subscription
end

def create
  @user = User.new(params[:user])
  if @user.save_with_payment
    sign_in @user
    flash[:success] = "Welcome to the SendEvent!"
    redirect_to @user
  else
    render 'new'
  end
end

これは次の形式です。

<%= form_for @user, :html => {:class => "form-inline"} do |f|  %>
    <%= render 'shared/error_messages', object: f.object %>
    <div class="control-group">
      <%= f.label :name, :class => "control-label" %> 
      <%= f.text_field :name %>
    </div>  

    # A few more fields here and...

    # The nested model:
    <%= f.fields_for :subscription do |builder| %>
      <%= builder.hidden_field :status, :value => true %>
    <% end %>
    <%= f.submit "Create my account", class: "btn btn-large btn-primary", id: "submitacct" %>
<% end %>
4

1 に答える 1

0

RailsCasts のサンプルアプリ

RailsCasts エピソード #196: ネストされたモデル フォーム (改訂版)

多分あなたを助けます。

于 2012-05-16T22:39:34.327 に答える