父变量在创建子错误后消失?

时间:2014-05-03 14:57:55

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

我有以下型号用户,爸爸,妈妈和小孩。

class Dad
 has_many :kids
end

class Mom
 has_many :kids
end

class User
 has_many :kids
end

class Kid
 belongs_to :mom
 belongs_to :dad
 belongs_to :user
end

我想在爸爸和妈妈里面创造一个新的孩子。

resources :dads
 resources :moms
   resources :kids
 end
end

dads/1/moms/1/kids/new

# KidsController
def new
  @dad = Dad.find(params[:dad_id])
  @mom = Mom.find(params[:mom_id])
  @kid = Kid.new
end

def create
  @kid = current_user.kids.build(kid_params)

  respond_to do |format|
    if @kid.save
     format.html { redirect_to @kid, notice: 'Kid was successfully created.' }
     format.json { render action: 'show', status: :created, location: @kid }
    else
     format.html { render action: 'new' }
     format.json { render json: @kid.errors, status: :unprocessable_entity }
    end
  end
end

在我看来,我有变量@dad.name@mom.name但是当创建一个孩子时发生错误,我得到:

undefined method `name' for nil:NilClass

我相信这是因为我没有:

@dad = Dad.find(params[:dad_id])
@mom = Mom.find(params[:mom_id])

create行动中,但也不起作用。

Couldn't find Dad without an ID

那我该如何纠正呢?

修改

这是我的观点。

Kids/new.html.erb

<% provide(:title, "Adding New Kid for #{@dad.name.titleize} and #{@mom.name.titleize}") %>
<% page_header "Adding New Kid for #{@dad.name.titleize} and #{@mom.name.titleize}" %>

<%= form_for @kid do |f| %>
  # kid fields
<% end %>

以及我如何获得providepage_header

ApplicationHelper

def full_title(page_title)
  base_title = "Kid Zone"
  if page_title.empty?
    base_title
  else
    "#{base_title} | #{page_title}"
  end
end

def page_header(page_title)
  content_for(:page_header) { page_title }
end

共享/ page_header.html.erb

<div class="page-header">
  <h3><%= yield(:page_header) %></h3>
</div>

布局/ application.html.erb

<head>
   <title><%= full_title(yield(:title)) %></title>
</head>

答案

必须使我的kid表格成为:

 <%= form_for [@dad, @mom, @kid] do |f| %>
      # kid fields
 <% end %>

并添加到create操作,就像我的new操作一样:

@dad = Dad.find(params[:dad_id])
@mom = Mom.find(params[:mom_id])

2 个答案:

答案 0 :(得分:2)

已编辑的答案

由于其他所有内容都是有序的,并且添加了表单的信息,因此您需要为应用中的其他所有内容创建嵌套资源的表单。所以当它失败时你不会丢失信息。

<%= form_for [@dad,@mom,@kid] do |f| %>
  # kid fields
<% end %>

您肯定会在[{1}}

指定的@dad函数中找到@momcreate

答案 1 :(得分:1)

当您创建@kid时,您永远不会说@mom@dad是他的父母 - 他们可能只是街对面的一对夫妇。当@kid到达创建时 - @mom@dad已经消失(带有ids)。

因此,您需要在呈现视图之前在@kid.mom操作中指定@kid.dadnew

def new
  @dad = Dad.find(params[:dad_id])
  @mom = Mom.find(params[:mom_id])
  @kid = Kid.new
  @kid.mom = @mom
  @kid.dad = @dad
end