NameError,未初始化的常量

时间:2016-12-19 22:01:57

标签: ruby-on-rails rails-activerecord

我尝试使用rails提交一个简单的表单。

class BibliographiesController < ApplicationController
   def creer #this has been localized for create
       @bibliography = Bibliography.new(bibliographie_params)
       @bibliography.save
       redirect_to @bibliography
   end
   #etc etc

private

    def bibliographie_params
        params.require(:bibliographie).permit(:titre, :soustitre, :auteur_un, :auteur_deux, :auteur_trois, :auteur_quatre, :genre, :recueil, :review, :revue_numero, :annee, :revue_page, :editeur, :lieu, :commentaire)
    end
end

迁移文件包含相同的字段。 titre和soustitre都是字符串,auteur_un是一个整数。

当我提交表单时,出现错误,即:

NameError in BibliographiesController#creer
uninitialized constant Bibliography::AuteurUn

params_hash包含:

"bibliographie"=>{
"titre"=>"La vie urbaine à Douai au Moyen-Âge", 
"soustitre"=>"rien", 
"auteur_un"=>"1", 
"genre"=>"source", 
"recueil"=>"aucun", 
"review"=>"", 
"revue_numero"=>"", 
"annee"=>"", 
"revue_page"=>"", 
"editeur"=>"", 
"lieu"=>"", 
"commentaire"=>""}

这是我的参考书目类:

class Bibliography < ApplicationRecord
    has_one :auteur_un, foreign_key: "auteurs_id"
    has_one :auteur_deux, foreign_key: "auteurs_id"
    has_one :auteur_trois, foreign_key: "auteurs_id"
    has_one :aauteur_quatre, foreign_key: "auteurs_id"
    has_one :review, foreign_key: "reviews_id"
end

看起来rails希望auteur_un成为一个类或常量。但我不明白为什么。

由于

1 个答案:

答案 0 :(得分:1)

通常,当您要使用foreign_key以外的属性关联外部模型(例如:has_one)时,some_model选项应与some_model_id关联一起使用。

您使用has_one有四种不同的auteurs_id关联。

我认为您拥有Auteur模型,并希望Bibliography模型有四个关联:auteur_un:auteur_deux:auteur_trois:auteur_quatre,每个都指向不同的Auteur实例。

如果情况确实如此,我想您想使用belongs_to关联,而不是:

class Bibliography < ApplicationRecord
    belongs_to :auteur_un, class_name: "Auteur"
    belongs_to :auteur_deux, class_name: "Auteur"
    belongs_to :auteur_trois, class_name: "Auteur"
    belongs_to :auteur_quatre, class_name: "Auteur"
    ...
end

此关联希望Bibliography模型包含auteur_un_idauteur_deux_idauteur_trois_idauteur_quatre_id,因此您需要修改“auteur”列(每个都附加“_id”)。例如,您的私人参数方法将更改为:

def bibliographie_params
    params.require(:bibliographie).permit(:titre, :soustitre, :auteur_un_id, :auteur_deux_id, :auteur_trois_id, :auteur_quatre_id, :genre, :recueil, :review, :revue_numero, :annee, :revue_page, :editeur, :lieu, :commentaire)
end

或者,您可以使用foreign_key选项,而无需更改列名称:

class Bibliography < ApplicationRecord
    belongs_to :auteur_un, class_name: "Auteur", foreign_key: "auteur_un"
    belongs_to :auteur_deux, class_name: "Auteur", foreign_key: "auteur_deux"
    belongs_to :auteur_trois, class_name: "Auteur", foreign_key: "auteur_trois"
    belongs_to :auteur_quatre, class_name: "Auteur", foreign_key: "auteur_quatre"
    ...
end

但最好的做法是遵守铁路公司的惯例。