我有3个名为Mom,Kid和Favorite的模特。
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
我试图在kids/show
路线中收藏一位妈妈:
class KidsController < ApplicationController
show
@kid = Kid.find(params[:id])
end
# link to favorite kid's mom at kids/show
link_to({ controller: 'favorites', action: 'create', id: @kid.mom.id }, { method: :post })
现在我遇到的问题是当我尝试在我的收藏夹控制器中使用此代码创建它时:
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
它抛出了这个错误:
undefined method `mom' for nil:NilClass
从这一行开始,我相信:@favorites.mom_id = @kid.mom.id
为什么会这样?
答案 0 :(得分:1)
您可能需要使用accepts_nested_attributes_for
答案 1 :(得分:1)
感谢Baloo,Pavan和MrYoshiji,我能够让它发挥作用。我的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
答案 2 :(得分:1)
方式强>
您未在@kid
班级中设置create
变量
-
当您收到no method
错误时,您通常会发现这是问题所在:
未定义的方法`妈妈&#39;为零:NilClass
此处的错误不是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