我有以下型号用户,爸爸,妈妈和小孩。
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 %>
以及我如何获得provide
和page_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])
答案 0 :(得分:2)
由于其他所有内容都是有序的,并且添加了表单的信息,因此您需要为应用中的其他所有内容创建嵌套资源的表单。所以当它失败时你不会丢失信息。
<%= form_for [@dad,@mom,@kid] do |f| %>
# kid fields
<% end %>
您肯定会在[{1}}
指定的@dad
函数中找到@mom
和create
答案 1 :(得分:1)
当您创建@kid
时,您永远不会说@mom
和@dad
是他的父母 - 他们可能只是街对面的一对夫妇。当@kid
到达创建时 - @mom
和@dad
已经消失(带有ids)。
因此,您需要在呈现视图之前在@kid.mom
操作中指定@kid.dad
和new
:
def new
@dad = Dad.find(params[:dad_id])
@mom = Mom.find(params[:mom_id])
@kid = Kid.new
@kid.mom = @mom
@kid.dad = @dad
end