未知属性错误:控件的未知属性'news_id':注释



在尝试在新闻中发表评论时,我得到了命名空间模型的未知属性错误。

控制/news.rb

class Control::News < ApplicationRecord
    belongs_to :user
    belongs_to :control_category, class_name: "Control::Category"
    has_many :control_comments, class_name: "Control::Comment", :foreign_key => 'control_news_id'
end
控制/comments.rb

class Control::Comment < ApplicationRecord
    belongs_to :control_news, class_name: "Control::News", :foreign_key => "control_news_id"
end

注释迁移文件

class CreateControlComments < ActiveRecord::Migration[5.0]
  def up
    create_table :control_comments do |t|
      t.string "name"
      t.string "email"
      t.text "comment"
      t.references :control_news, foreign_key: true
      t.boolean "status", :default => false
      t.timestamps
    end
    def down
        drop_table :comments
    end
  end
end

它不工作。每当我尝试发表评论时,我都会得到未知属性"news_id",但外键是"control_news_id"。请帮我修一下。

Rails控制台

a = Control::News.find(112)
b = b.control_comments.create(name: "test")
ActiveModel::UnknownAttributeError: unknown attribute 'news_id' for Control::Comment.
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activemodel-5.0.0.1/lib/active_model/attribute_assignment.rb:48:in `_assign_attribute'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activemodel-5.0.0.1/lib/active_model/attribute_assignment.rb:40:in `block in _assign_attributes'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activemodel-5.0.0.1/lib/active_model/attribute_assignment.rb:39:in `each'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activemodel-5.0.0.1/lib/active_model/attribute_assignment.rb:39:in `_assign_attributes'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/attribute_assignment.rb:26:in `_assign_attributes'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activemodel-5.0.0.1/lib/active_model/attribute_assignment.rb:33:in `assign_attributes'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/associations/association.rb:172:in `initialize_attributes'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/associations/association.rb:254:in `block in build_record'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/core.rb:321:in `initialize'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/inheritance.rb:65:in `new'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/inheritance.rb:65:in `new'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/reflection.rb:152:in `build_association'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/associations/association.rb:253:in `build_record'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/associations/collection_association.rb:165:in `build'
    from /Users/santosharyal/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.1/lib/active_record/associations/collection_proxy.rb:294:in `build'
    from (irb):7

因为您是手动设置class_name, Active Record不能自动识别双向关系。您需要通过添加inverse_of.

来告诉Control::News如何找到自己。
    has_many :control_comments, class_name: "Control::Comment",inverse_of: 'control_news', :foreign_key => 'control_news_id'

您可以在这里阅读更多关于双向关联的信息http://guides.rubyonrails.org/association_basics.html#bi-directional-associations

最新更新