如何从link_to创建资源而没有直接关联?

时间:2014-07-04 15:50:54

标签: ruby-on-rails ruby ruby-on-rails-4

我有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

为什么会这样?

3 个答案:

答案 0 :(得分:1)

您可能需要使用accepts_nested_attributes_for

查看this railscasts

答案 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