Ruby on rails 如何从link_到创建没有直接关联的资源?

Ruby on rails 如何从link_到创建没有直接关联的资源?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有三个模特,分别是妈妈、孩子和最爱 class Mom < ActiveRecord::Base has_many :kids has_many :favorites class Kid < ActiveRecord::Base belongs_to :mom belongs_to :user class Favorite < ActiveRecord::Base belongs_to :mom belongs_to :user 现在我遇到的问题

我有三个模特,分别是妈妈、孩子和最爱

class Mom < ActiveRecord::Base
  has_many :kids
  has_many :favorites

class Kid < ActiveRecord::Base
  belongs_to :mom
  belongs_to :user

class Favorite < ActiveRecord::Base
  belongs_to :mom
  belongs_to :user
现在我遇到的问题是,当我尝试在我的收藏夹控制器中使用以下代码创建它时:

class FavoritesController < ApplicationController

def create
  @mom = Mom.find(params[:id])
  @favorites = current_user.favorites.build(params[:favorites])
  @favorites.mom_id = @kid.mom.id

  if @favorites.save
    redirect_to :back, notice: "#{@favorite.mom.name.titleize} is one of your favorites now."
  else
    redirect_to :back
  end
end
从这句话中我相信:
@favorites.mom\u id=@kid.mom.id


这是为什么呢?

您可能需要为


看看吧

多亏了巴鲁、帕万和吉吉先生,我才能够让它工作。只需对我的
create
操作进行一些小更改,即可使一切正常工作:

def create
  @mom = Mom.find(params[:id])
  @favorite = current_user.favorites.build(params[:favorites])
  @favorite.mom_id = @mom.id

  if @favorite.save
    redirect_to :back, notice: "#{@favorite.mom.name.titleize} is one of your favorites now."
  else
    redirect_to :back
  end
end

方法

您尚未在
create
类中设置
@kid
变量

--

当您收到
no method
错误时,您通常会发现这就是问题所在:

nil:NilClass的未定义方法“mom”

这里的错误不是
mom
方法,而是
nil:NilClass
-您没有设置
@kid

我会这样做:

def create
  @mom = Mom.find(params[:id])
  @favorites = current_user.favorites.build(favorites_params)

  if @favorites.save
    redirect_to :back, notice: "#{@favorite.mom.name.titleize} is one of your favorites now."
  else
    redirect_to :back
  end
end

private

def favorites_params
    params.require(:favorites).permit(:your, :attributes).merge(mom_id: @mom_id)
end

您的创建没有
@kid
。你的意思是把
@mom.id
放在你的
创建
方法中没有初始化
@kid
。也许你的意思是像@baloo所说的
@mom.id
。你还需要在这行
@favorite
中将
@favorites
改为
@favorites
重定向到:back,注意:“{@favorite.mom.name.titleize}”是您现在的收藏夹之一。“
以避免将来出现另一个错误。按照您的逻辑,
@mom
使用
参数[:id]
,以及
@favorites
mom\u id
(应为单数)正在使用
@kid.mom.id
==>更新,为什么不直接使用
@favorites.mom\u id=@mom.id
def create
  @mom = Mom.find(params[:id])
  @favorite = current_user.favorites.build(params[:favorites])
  @favorite.mom_id = @mom.id

  if @favorite.save
    redirect_to :back, notice: "#{@favorite.mom.name.titleize} is one of your favorites now."
  else
    redirect_to :back
  end
end
def create
  @mom = Mom.find(params[:id])
  @favorites = current_user.favorites.build(favorites_params)

  if @favorites.save
    redirect_to :back, notice: "#{@favorite.mom.name.titleize} is one of your favorites now."
  else
    redirect_to :back
  end
end

private

def favorites_params
    params.require(:favorites).permit(:your, :attributes).merge(mom_id: @mom_id)
end