Проблема с ассоциацией has_one в Rails

Я был озадачен этой проблемой уже несколько часов, и я надеюсь, что кто-нибудь поможет мне понять, почему этот код не работает.

Я пытаюсь создать учетную запись, связанную с конкретным пользователем. Я могу создать пользователя, но когда я перехожу к созданию учетной записи, это не похоже на то, что форма публикуется в методе создания в моем контроллере (массив данных формы отображается добавленным к учетным записям/новым в моей панели браузера) .

Вот мои модели:

class User < ActiveRecord::Base
  attr_accessible :email_address, :password, :password_confirmation
  has_secure_password
  has_one :account, dependent: :destroy

  before_save {|user| user.email_address = email_address.downcase} 

И моя модель учетной записи:

class Account < ActiveRecord::Base
  attr_accessible :cell_phone, :first_name, :home_phone, :last_name, :middle_initial, :work_phone
  belongs_to :user
  has_many :addresses
  has_many :orders
  has_many :items

  #strip digits and return string of numbers
  before_save do |account|
    account.cell_phone = cell_phone.gsub(/\D/,'')
    account.home_phone = home_phone.gsub(/\D/,'')
    account.work_phone = work_phone.gsub(/\D/,'')
  end

  before_save do |account|
    account.first_name = first_name.capitalize
    account.last_name  = last_name.capitalize
    account.middle_initial = middle_initial.capitalize
  end

В моем пользовательском контроллере (это работает правильно):

def new
    if signed_in?
      @user = current_user
      redirect_to @user
    else
      @user = User.new
    end
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      redirect_to new_account_path
    else
      flash[:error] = "Sorry, something went wrong"
      render 'new'
    end
  end

И мой контроллер учетных записей (там, где я чувствую проблему):

class AccountsController < ApplicationController
  #before_filter :get_current_user
  before_filter :signed_in_user

  def new
    @user = current_user
    @account = @user.build_account(params[:account])
  end

  def create
    @user = current_user
    @account = @user.build_account(params[:account])
    if @account.save
      flash[:success]
      redirect_to user_path(current_user)
    else
      flash[:error]
      redirect_to root_path
    end
  end

У меня есть методы current_user и sign_in в вспомогательном файле.

И, наконец, форма моей учетной записи

<%= form_for(@account) do |form| %>
    <%= render 'shared/user_form_error_messages', object: form.object %>

    <%= form.label :first_name, "First Name" %>
    <%= form.text_field :first_name %>

    <%= form.label :middle_initial, "Middle Initial (optional)" %>
    <%= form.text_field :middle_initial %>

    <%= form.label :last_name, "Last Name" %>
    <%= form.text_field :last_name %>

    <%= form.label :home_phone, "Home Phone" %>
    <%= form.text_field :home_phone %>

    <%= form.label :cell_phone, "Cell Phone" %>
    <%= form.text_field :cell_phone %>

    <%= form.label :work_phone, "Work Phone" %>
    <%= form.text_field :work_phone %>

    <%= form.submit "Complete Account", class:"btn" %>

<% end %>

Заранее спасибо за помощь. Я гуглил примеры, читал rdocs и пробовал кучу разных вещей. Если бы кто-нибудь мог объяснить, почему мой код не работает (а не просто дать мне ответ), я был бы очень признателен.

По запросу @thesis вот вывод из моего журнала, когда я нажимаю «отправить» в форме:

Started GET "/accounts/new?    utf8=%E2%9C%93&authenticity_token=DQ5mOiICI0C83l9xgkSlvToQKyWjE3Adm3X3U0HJ1W4%3D&account%5Bfirst_name%5D=Jesse&account%5Bmiddle_initial%5D=A&account%5Blast_name%5D=Flores&account%5Bhome_phone%5D=555-555-5555&account%5Bcell_phone%5D=&account%5Bwork_phone%5D=&commit=Complete+Account" for 127.0.0.1 at 2012-10-04 16:14:11 -0400
Connecting to database specified by database.yml
Processing by AccountsController#new as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"DQ5mOiICI0C83l9xgkSlvToQKyWjE3Adm3X3U0HJ1W4=", "account"=>{"first_name"=>"Jesse", "middle_initial"=>"A", "last_name"=>"Flores", "home_phone"=>"555-555-5555", "cell_phone"=>"", "work_phone"=>""}, "commit"=>"Complete Account"}
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'B_E1bsUASQhHC-Zb-6updg' LIMIT 1
  Account Load (0.6ms)  SELECT "accounts".* FROM "accounts" WHERE "accounts"."user_id" = 2 LIMIT 1
   (0.1ms)  begin transaction
   (0.0ms)  commit transaction
  Rendered shared/_user_form_error_messages.html.erb (0.5ms)
  Rendered forms/_form_account.html.erb (5.9ms)
  Rendered accounts/new.html.erb within layouts/application (13.2ms)
  Rendered layouts/_navigation.html.erb (0.4ms)
  Rendered forms/_form_header_signin.html.erb (0.8ms)
  Rendered layouts/_header.html.erb (2.7ms)
  Rendered layouts/_messages.html.erb (0.5ms)
  Rendered layouts/_footer.html.erb (0.3ms)
Completed 200 OK in 279ms (Views: 160.1ms | ActiveRecord: 4.6ms)

person jflores    schedule 04.10.2012    source источник
comment
Пожалуйста, обновите свой вопрос и добавьте часть журнала, в которой у вас есть процесс публикации формы.   -  person thesis    schedule 04.10.2012
comment
@thesis это то, что вы имели в виду?   -  person jflores    schedule 05.10.2012


Ответы (2)


Извините, я сначала неправильно понял проблему. Однако похоже, что вы хотите связать существующий объект user с новым account. Вот ссылка, которая должна вам помочь.

https://stackoverflow.com/a/11335976/1160106

Постановка большой проблемы, но четкий и краткий ответ. Дайте мне знать, если это поможет вам.

person Samiron    schedule 04.10.2012
comment
спасибо за предложение. Однако это не сработало. Я получил следующую ошибку: неопределенный метод `user_accounts_path' для #‹#‹Class:0x007fd9b4046e98›:0x007fd9b4de5338›, несмотря на то, что я изменил свой путь маршрутов, следуя этим инструкциям (т. е. используя единственный ресурс, вложенный в пользователей). - person jflores; 05.10.2012
comment
Разве не должно быть user_account_path вместо user_accounts_path? Обратите внимание, что accounts будет account. Что показывает rake routes? - person Samiron; 05.10.2012
comment
Спасибо, Самирон, очень помогло! Я также предполагал, что когда форма будет отправлена, она автоматически отправится в мой метод создания. Итак, я поместил методы build_account и .save в свой «новый» метод и просто обрабатываю создание учетной записи оттуда. - person jflores; 06.10.2012

Надеюсь, это поможет вам в создании вложенных экземпляров в вашем коде. В Accountscontroller,

  def new
    @user = current_user
    @account = @user.accounts.build(params[:account])
  end

  def create
    @user = current_user
    @account = @user.accounts.build(params[:account])
    if @account.save
      flash[:success]
person kanna    schedule 04.10.2012
comment
Привет Шанмук, спасибо за ваше предложение. К сожалению, это не работает. Поскольку это отношение has_one, у меня нет объекта Active Record, для которого я мог бы использовать методы сборки или создания. Согласно документам Rails, я должен использовать метод build_association или create_association для создания связанной записи. - person jflores; 04.10.2012