section_id:nil当它应该是section_id:1

时间:2016-09-18 03:02:19

标签: many-to-many ruby-on-rails-5 model-associations

我正在跟随Kevin Skoglund学习LYNDA.COM教程。我正在跟随“多对多”关联:当我遇到问题时,我会播放“视频”。我跑的最后一行(section.section_edits) 结果如下:

SectionEdit id: 6, admin_user_id: 1, section_id: nil,  ...

然而凯文在教程上的结果是:

SectionEdit id: 1, admin_user_id: 1, section_id: 1,  ...

显然我已经多次回去试图找到我的错误,这就是我的SectionEdit id:与他不同的原因。但我的问题是:为什么我的section_id: nil

编辑:09/25/16

我在命令提示符中输入了section.errors,但没有完全理解控制台响应。 @AlterLagos

irb(main):004:0> section = Section.create(:name => "Section One", :position => 1) (0.5ms) BEGIN (1.0ms) ROLLBACK => #<Section id: nil, page_id: nil, name: "Section One", position: 1, visible: false, content_type: nil, content: nil, created_at: nil, updated_at: nil> irb(main):005:0> section.errors => #<ActiveModel::Errors:0x6340fe0 @base=#<Section id: nil, page_id: nil, name: "Section One", position: 1, visible: false, content_type: nil, content: nil, created_at: nil, updated_at: nil>, @messages={:page=>["must exist"]}, @details={:page=>[{:error=>:blank}]}>

以下是我的consol和相关课程。谢谢!

MY COMMAND PROMPT

C:\Users\David\My Documents\sites\simple_cms>rails console
Loading development environment (Rails 5.0.0.1)

irb(main):001:0> me = AdminUser.find(1)
  AdminUser Load (4.0ms)  SELECT  `admin_users`.* FROM `admin_users` WHERE`admin_users`.`id` = 1 LIMIT 1
=> #<AdminUser id: 1, first_name: "David", last_name: "Boyette", email: "", hashed_password: nil, created_at: "2016-09-08 02:52:57", updated_at: "2016-09-08 02:52:57", username: "dboyette", salt: nil>

irb(main):002:0> me.section_edits
  SectionEdit Load (3.5ms)  SELECT `section_edits`.* FROM `section_edits` WHERE `section_edits`.`admin_user_id` = 1
=> #<ActiveRecord::Associations::CollectionProxy [#<SectionEdit id: 1, admin_user_id: 1, section_id: nil, summary: "Test edit", created_at: "2016-09-09 01:19:08", updated_at: "2016-09-09 01:19:08">, #<SectionEdit id: 2, admin_user_id: 1, section_id: nil, summary: "Test edit", created_at: "2016-09-10 00:05:56", updated_at: "2016-09-10 00:05:56">, #<SectionEdit id: 3, admin_user_id: 1, section_id: nil, summary: "Ch-ch-ch-changes", created_at: "2016-09-10 00:09:39", updated_at: "2016-09-10 00:09:39">, #<SectionEdit id: 4, admin_user_id: 1, section_id: nil, summary: "Test edit", created_at: "2016-09-17 03:32:13", updated_at: "2016-09-17 03:32:13">, #<SectionEdit id: 5, admin_user_id: 1, section_id: nil, summary: "Test edit", created_at: "2016-09-18 00:48:40", updated_at: "2016-09-18 00:48:40">]>

irb(main):003:0> section = Section.create(:name => "Section One", :position => 1)
   (1.0ms)  BEGIN
   (1.0ms)  ROLLBACK
=> #<Section id: nil, page_id: nil, name: "Section One", position: 1, visible: false, content_type: nil, content: nil, created_at: nil, updated_at: nil>

irb(main):004:0> section.section_edits => #<ActiveRecord::Associations::CollectionProxy []>

irb(main):005:0> edit = SectionEdit.new
=> #<SectionEdit id: nil, admin_user_id: nil, section_id: nil, summary: nil, created_at: nil, updated_at: nil>

irb(main):006:0> edit.summary = "Test edit"
=> "Test edit"

irb(main):007:0> section.section_edits << edit
=> #<ActiveRecord::Associations::CollectionProxy [#<SectionEdit id: nil, admin_user_id: nil, section_id: nil, summary: "Test edit", created_at: nil, updated_at: nil>]>

irb(main):008:0> edit.editor = me
=> #<AdminUser id: 1, first_name: "David", last_name: "Boyette", email: "", hashed_password: nil, created_at: "2016-09-08 02:52:57", updated_at: "2016-09-08 02:52:57", username: "dboyette", salt: nil>

irb(main):009:0> edit.save
   (1.5ms)  BEGIN
  SQL (3.0ms)  INSERT INTO `section_edits` (`admin_user_id`, `summary`, `created_at`, `updated_at`) VALUES (1, 'Test edit', '2016-09-18 01:44:41', '2016-09-18 01:44:41')
   (69.3ms)  COMMIT
=> true

irb(main):010:0> section.section_edits
=> #<ActiveRecord::Associations::CollectionProxy [#<SectionEdit id: 6, admin_user_id: 1, section_id: nil, summary: "Test edit", created_at: "2016-09-18 01:44:41", updated_at: "2016-09-18 01:44:41">]>

irb(main):011:0>

section.rb

class Section < ApplicationRecord

belongs_to :page
has_many :section_edits
has_many :editors, :through => :section_edits, :class_name => "AdminUser"

章节迁移

class CreateSections < ActiveRecord::Migration[5.0]
改变了     create_table:sections do | t |

  t.integer "page_id"
  # same as t.reference :page
  t.string "name"
  t.integer "position"
  t.boolean "visible", :default => false
  t.string "content_type"
  t.text "content"
  t.timestamps

end

add_index("sections", "page_id")

端 端

section_edit.rb

class SectionEdit < ApplicationRecord

belongs_to :editor, :class_name => "AdminUser", :foreign_key => 'admin_user_id'
belongs_to :section

section_edits迁移

class CreateSectionEdits < ActiveRecord::Migration[5.0]
改变了     create_table:section_edits do | t |

t.references :admin_user
t.references :section
t.string "summary"
t.timestamps

end
add_index :section_edits, ['admin_user_id', 'section_id']

端 端

型号:page.rb

`class Page&lt; ApplicationRecord

belongs_to :subject
has_many :sections
has_and_belongs_to_many :editors, :class_name => "AdminUser"

端 `

控制器:页面

class PagesController < ApplicationController end

迁移:页面

`class CreatePages&lt; ActiveRecord的::迁移[5.0]   改变     create_table:pages do | t |

  t.integer "subject_id"
  # same as t.references :subject
  t.string "name"
  t.string "permalink"
  t.integer "position"
  t.boolean "visible", :default => false
  t.timestamps

end
add_index("pages", "subject_id")
add_index("pages", "permalink")

端 end`

3 个答案:

答案 0 :(得分:1)

检查您的控制台,显然这是一个问题:

irb(main):003:0> section = Section.create(:name => "Section One", :position => 1)
   (1.0ms)  BEGIN
   (1.0ms)  ROLLBACK
=> #<Section id: nil, page_id: nil, name: "Section One", position: 1, visible: false, content_type: nil, content: nil, created_at: nil, updated_at: nil>

如您所见,由于创建节之后的验证错误,正在回滚,因此节对象具有id: nil。我想这是因为您没有在问题代码中包含验证,但在创建该部分后,您可以使用section.errors轻松检查控制台中的错误,并查看问题所在。

答案 1 :(得分:0)

只是想在此处添加一些信息以防其他人遇到同样的问题。

Alter Lagos是正确的,该部分有一个限制,它必须分配一个页面。这就是导致呼叫失败的原因。

要创建节对象,请执行以下操作:(它不在视频中)。

page = Page.first

然后创建该部分并传入页面。

section = Section.create(:name => "Section One", :position => 1, :page => page)

答案 2 :(得分:0)

在section.rb文件中 - 做了 belongs_to:page,{:optional =&gt;真}

然后在rails console run- section = Section.create(:name =&gt;&#34; Section One&#34;,:position =&gt; 1)

干杯