Ruby on rails 无法实现一个关系

Ruby on rails 无法实现一个关系,ruby-on-rails,nested-forms,has-one,Ruby On Rails,Nested Forms,Has One,我正在尝试创建一个帐户管理系统,允许一个帐户有一个帐单地址。我希望帐户和地址有自己的控制器和模型。管理员用户将创建一个新帐户,然后被重定向为该帐户创建一个新的帐单地址。第一部分工作正常,我可以创建帐户,但第二部分只将account_id属性保存到addresses表中。下面是我的代码: 财务主任 class AccountsController < ApplicationController def new @account = Account.new end def cr

我正在尝试创建一个帐户管理系统,允许一个帐户有一个帐单地址。我希望帐户和地址有自己的控制器和模型。管理员用户将创建一个新帐户,然后被重定向为该帐户创建一个新的帐单地址。第一部分工作正常,我可以创建帐户,但第二部分只将account_id属性保存到addresses表中。下面是我的代码:

财务主任

class AccountsController < ApplicationController
 def new
   @account = Account.new
 end  
 def create
    @account = Account.new(params[:account])
    @account.build_address
   if @account.save
     flash[:success] = "Customer Account has been successfully created!"
     redirect_to '/newaddress'
   else
     render 'new'
   end
 end
end
class AddressesController < ApplicationController  
  def new
    @address = Address.new
  end
  def create
    @account = Account.find(params[:account])
    @address = @account.create_address(params[:address])
    redirect_to root_path
  end
end
最后,下面是相关表的模式

create_table "accounts", :force => true do |t|
  t.string   "contactEmail"
  t.string   "contactFirstName"
  t.string   "contactLastName"
  t.string   "contactPhone"
  t.datetime "joinDate"
  t.string   "business_name"
  t.datetime "created_at"
  t.datetime "updated_at"
end
create_table "addresses", :force => true do |t|
  t.string   "city"
  t.string   "state"
  t.string   "street"
  t.string   "zipCode"
  t.integer  "account_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end
(我对编程和rails还是新手,所以我发布了我认为与之相关的内容。)

当我打开新帐户页面,然后进入新地址页面时添加的日志

Started GET "/newaccount" for 127.0.0.1 at Tue Sep 20 17:21:56 -0500 2011
  Processing by AccountsController#new as HTML
Rendered shared/_error_messages.html.erb (0.6ms)
Rendered accounts/_account_fields.html.erb (13.0ms)
Rendered layouts/_stylesheets.html.erb (1.2ms)
  User Load (2.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
  CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
Rendered layouts/_header.html.erb (19.4ms)
Rendered layouts/_footer.html.erb (1.0ms)
Rendered accounts/new.html.erb within layouts/application (50.3ms)
Completed 200 OK in 168ms (Views: 64.6ms | ActiveRecord: 2.5ms)

Started POST "/accounts" for 127.0.0.1 at Tue Sep 20 17:22:11 -0500 2011
  Processing by AccountsController#create as HTML
  Parameters: {"commit"=>"Next", "account"=>{"business_name"=>"FooBar", "contactLastName"=>"Bar", "contactPhone"=>"1231231234", "contactEmail"=>"foo@bar.com", "contactFirstName"=>"Foo"}, "authenticity_token"=>"lJG89TIjcJighmFUWLg1uR9sJq0CHLvceeLH9QNocGY=", "utf8"=>"✓"}
  SQL (0.1ms)  BEGIN
  SQL (0.3ms)  SELECT 1 FROM `accounts` WHERE (LOWER(`accounts`.`contactEmail`) = LOWER('foo@bar.com')) LIMIT 1
  SQL (1.2ms)  describe `accounts`
  AREL (0.4ms)  INSERT INTO `accounts` (`created_at`, `contactFirstName`, `business_name`, `contactPhone`, `updated_at`, `contactEmail`, `contactLastName`, `joinDate`) VALUES ('2011-09-20 22:22:11', 'Foo', 'FooBar', '1231231234', '2011-09-20 22:22:11', 'foo@bar.com', 'Bar', NULL)
  SQL (1.5ms)  describe `addresses`
  AREL (0.2ms)  INSERT INTO `addresses` (`zipCode`, `state`, `city`, `updated_at`, `account_id`, `street`, `created_at`) VALUES (NULL, NULL, NULL, '2011-09-20 22:22:11', 31, NULL, '2011-09-20 22:22:11')
  SQL (26.3ms)  COMMIT
Redirected to http://localhost:3500/newaddress
Completed 302 Found in 85ms

Started GET "/newaddress" for 127.0.0.1 at Tue Sep 20 17:22:11 -0500 2011
  Processing by AddressesController#new as HTML
Rendered addresses/_address_fields.html.erb (83.4ms)
Rendered layouts/_stylesheets.html.erb (1.4ms)
  User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
  CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
Rendered layouts/_header.html.erb (17.1ms)
Rendered layouts/_footer.html.erb (0.9ms)
Rendered addresses/new.html.erb within layouts/application (113.6ms)
Completed 200 OK in 126ms (Views: 119.6ms | ActiveRecord: 30.3ms)

Started POST "/newaddress" for 127.0.0.1 at Tue Sep 20 17:22:29 -0500 2011
  Processing by AddressesController#new as HTML
  Parameters: {"address"=>{"city"=>"Boston", "street"=>"123 Main St", "zipCode"=>"02222", "state"=>"MA"}, "commit"=>"Create", "authenticity_token"=>"lJG89TIjcJighmFUWLg1uR9sJq0CHLvceeLH9QNocGY=", "utf8"=>"✓"}
Rendered addresses/_address_fields.html.erb (10.3ms)
Rendered layouts/_stylesheets.html.erb (1.2ms)
  User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
  CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
Rendered layouts/_header.html.erb (17.2ms)
Rendered layouts/_footer.html.erb (0.9ms)
Rendered addresses/new.html.erb within layouts/application (40.1ms)
Completed 200 OK in 54ms (Views: 47.3ms | ActiveRecord: 0.2ms)

快速查看,您只传递params[:account],跟踪日志并查看所需内容

class AddressesController < ApplicationController  
 def new
   @address = Address.new
  end
 def create
    @account = Account.find(params[:account])
   @address = @account.create_address(params[:address])
   redirect_to root_path
 end
end
你的控制器有

   def create
@account = Account.find(params[:account])
@address = @account.create_address(params[:address])
redirect_to root_path
结束

如您所见,没有@account=account.find(params[:account])


因此,如果您的帐户为空,您可以添加带有帐户id的隐藏字段以形成或捕获应用程序的其他类型。

我认为Address类中的行有误(去掉_属性):

类地址
我查看了日志,但仍然不知道自己做错了什么。我可以看到POST'/accounts'正在为addresses字段创建account\u id,但是POST'/newaddress'没有创建任何内容。我不确定还需要传递什么。请在尝试创建地址时粘贴日志。我添加了日志。谢谢你的帮助。另外,users表是用于创建帐户和相关账单地址的管理员用户的表。我曾尝试根据某人的建议添加“_属性”,但现在已将其删除。即使没有,它似乎也不起作用。请在Account.rb中注释掉可访问的属性,并让我知道您得到了什么。我注释掉了它,但它仍然不起作用。/newaddress的post方法似乎没有任何作用。如果表单位于同一页面上,我可以使用字段\ u for:address使其工作。这让我觉得,当我在自己的页面上有每个表单时,我没有向它传递正确的帐户id,以便它知道在地址表中写入到哪里。我会使用字段,然后在需要时使用Ajax将它们直观地分开(例如,如果您需要它看起来像步骤1、步骤2等)。。。
Started GET "/newaccount" for 127.0.0.1 at Tue Sep 20 17:21:56 -0500 2011
  Processing by AccountsController#new as HTML
Rendered shared/_error_messages.html.erb (0.6ms)
Rendered accounts/_account_fields.html.erb (13.0ms)
Rendered layouts/_stylesheets.html.erb (1.2ms)
  User Load (2.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
  CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
Rendered layouts/_header.html.erb (19.4ms)
Rendered layouts/_footer.html.erb (1.0ms)
Rendered accounts/new.html.erb within layouts/application (50.3ms)
Completed 200 OK in 168ms (Views: 64.6ms | ActiveRecord: 2.5ms)

Started POST "/accounts" for 127.0.0.1 at Tue Sep 20 17:22:11 -0500 2011
  Processing by AccountsController#create as HTML
  Parameters: {"commit"=>"Next", "account"=>{"business_name"=>"FooBar", "contactLastName"=>"Bar", "contactPhone"=>"1231231234", "contactEmail"=>"foo@bar.com", "contactFirstName"=>"Foo"}, "authenticity_token"=>"lJG89TIjcJighmFUWLg1uR9sJq0CHLvceeLH9QNocGY=", "utf8"=>"✓"}
  SQL (0.1ms)  BEGIN
  SQL (0.3ms)  SELECT 1 FROM `accounts` WHERE (LOWER(`accounts`.`contactEmail`) = LOWER('foo@bar.com')) LIMIT 1
  SQL (1.2ms)  describe `accounts`
  AREL (0.4ms)  INSERT INTO `accounts` (`created_at`, `contactFirstName`, `business_name`, `contactPhone`, `updated_at`, `contactEmail`, `contactLastName`, `joinDate`) VALUES ('2011-09-20 22:22:11', 'Foo', 'FooBar', '1231231234', '2011-09-20 22:22:11', 'foo@bar.com', 'Bar', NULL)
  SQL (1.5ms)  describe `addresses`
  AREL (0.2ms)  INSERT INTO `addresses` (`zipCode`, `state`, `city`, `updated_at`, `account_id`, `street`, `created_at`) VALUES (NULL, NULL, NULL, '2011-09-20 22:22:11', 31, NULL, '2011-09-20 22:22:11')
  SQL (26.3ms)  COMMIT
Redirected to http://localhost:3500/newaddress
Completed 302 Found in 85ms

Started GET "/newaddress" for 127.0.0.1 at Tue Sep 20 17:22:11 -0500 2011
  Processing by AddressesController#new as HTML
Rendered addresses/_address_fields.html.erb (83.4ms)
Rendered layouts/_stylesheets.html.erb (1.4ms)
  User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
  CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
Rendered layouts/_header.html.erb (17.1ms)
Rendered layouts/_footer.html.erb (0.9ms)
Rendered addresses/new.html.erb within layouts/application (113.6ms)
Completed 200 OK in 126ms (Views: 119.6ms | ActiveRecord: 30.3ms)

Started POST "/newaddress" for 127.0.0.1 at Tue Sep 20 17:22:29 -0500 2011
  Processing by AddressesController#new as HTML
  Parameters: {"address"=>{"city"=>"Boston", "street"=>"123 Main St", "zipCode"=>"02222", "state"=>"MA"}, "commit"=>"Create", "authenticity_token"=>"lJG89TIjcJighmFUWLg1uR9sJq0CHLvceeLH9QNocGY=", "utf8"=>"✓"}
Rendered addresses/_address_fields.html.erb (10.3ms)
Rendered layouts/_stylesheets.html.erb (1.2ms)
  User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
  CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IS NULL LIMIT 1
Rendered layouts/_header.html.erb (17.2ms)
Rendered layouts/_footer.html.erb (0.9ms)
Rendered addresses/new.html.erb within layouts/application (40.1ms)
Completed 200 OK in 54ms (Views: 47.3ms | ActiveRecord: 0.2ms)
class AddressesController < ApplicationController  
 def new
   @address = Address.new
  end
 def create
    @account = Account.find(params[:account])
   @address = @account.create_address(params[:address])
   redirect_to root_path
 end
end
 Parameters: {"address"=>{"city"=>"Boston", "street"=>"123 Main St", "zipCode"=>"02222", "state"=>"MA"}, "commit"=>"Create", "authenticity_token"=>"lJG89TIjcJighmFUWLg1uR9sJq0CHLvceeLH9QNocGY=", "utf8"=>"✓"}
   def create
@account = Account.find(params[:account])
@address = @account.create_address(params[:address])
redirect_to root_path
class Address < ActiveRecord::Base
    attr_accessible :city, :state, :street,  :zipCode   
    belongs_to :account
 end