第三级嵌套模型未收到表单中的祖父母 ID
3rd level nested model not receiving grandparent ID in form
我有 3 个模型。用户、简历和语言。一个用户有一份简历。简历有多种语言。用户通过其简历拥有多种语言。当我尝试保存表单时,我收到一条错误消息,指出该语言没有用户 ID。我怎样才能让用户 ID 通过 CV 和我表单中的语言?
CV 正在正确接收用户 ID。语言不是。
我正在使用 Simple-Form 和茧宝石。
表格的简化版本
= simple_form_for(@cv, url: user_cvs_path) do |f|
= f.simple_fields_for :languages do |language|
来自用户模型
has_one :cv, dependent: :destroy
has_many :languages, through: :cv, inverse_of: :user
来自简历模型
belongs_to :user
has_many :languages, dependent: :destroy
accepts_nested_attributes_for :languages, allow_destroy: true
来自语言模型
belongs_to :user
belongs_to :cv
来自 CV 控制器
before_action :set_user
def new
@cv = @user.build_cv
@cv.languages.build
end
def create
@cv = @user.create_cv(cv_params)
respond_to do |format|
if @cv.save
format.html { redirect_to user_cv_url(@user, @cv), notice: 'Cv was successfully created.' }
format.json { render :show, status: :created, location: @cv }
else
format.html { render :new }
format.json { render json: @cv.errors, status: :unprocessable_entity }
end
end
end
def cv_params
params.require(:cv).permit(
:user_id,
:first_name,
:middle_name,
:last_name,
... # lots of params left out for brevity
languages_attributes: [
:id,
:cv_id,
:user_id,
:name,
:read,
:write,
:speak,
:listen,
:_destroy])
end
def set_user
@user = current_user if user_signed_in?
end
您的语言模型不需要 belongs_to :user
。 Language属于CV,CV属于User,所以Language和User之间的关系已经存在。如果您需要访问特定语言的用户,您可以编写 @language.cv.user
要解决您的问题,只需从语言模型中删除 belongs_to :user,从 languages_attributes 中删除 user_id,并从语言模型中删除 user_id table.
我有 3 个模型。用户、简历和语言。一个用户有一份简历。简历有多种语言。用户通过其简历拥有多种语言。当我尝试保存表单时,我收到一条错误消息,指出该语言没有用户 ID。我怎样才能让用户 ID 通过 CV 和我表单中的语言?
CV 正在正确接收用户 ID。语言不是。
我正在使用 Simple-Form 和茧宝石。
表格的简化版本
= simple_form_for(@cv, url: user_cvs_path) do |f|
= f.simple_fields_for :languages do |language|
来自用户模型
has_one :cv, dependent: :destroy
has_many :languages, through: :cv, inverse_of: :user
来自简历模型
belongs_to :user
has_many :languages, dependent: :destroy
accepts_nested_attributes_for :languages, allow_destroy: true
来自语言模型
belongs_to :user
belongs_to :cv
来自 CV 控制器
before_action :set_user
def new
@cv = @user.build_cv
@cv.languages.build
end
def create
@cv = @user.create_cv(cv_params)
respond_to do |format|
if @cv.save
format.html { redirect_to user_cv_url(@user, @cv), notice: 'Cv was successfully created.' }
format.json { render :show, status: :created, location: @cv }
else
format.html { render :new }
format.json { render json: @cv.errors, status: :unprocessable_entity }
end
end
end
def cv_params
params.require(:cv).permit(
:user_id,
:first_name,
:middle_name,
:last_name,
... # lots of params left out for brevity
languages_attributes: [
:id,
:cv_id,
:user_id,
:name,
:read,
:write,
:speak,
:listen,
:_destroy])
end
def set_user
@user = current_user if user_signed_in?
end
您的语言模型不需要 belongs_to :user
。 Language属于CV,CV属于User,所以Language和User之间的关系已经存在。如果您需要访问特定语言的用户,您可以编写 @language.cv.user
要解决您的问题,只需从语言模型中删除 belongs_to :user,从 languages_attributes 中删除 user_id,并从语言模型中删除 user_id table.