我熟悉如何在Rails 4中使用典型的nested_attributes表单。但是我正在尝试在views / people / show.html.erb模板上创建一个表单,该模板仅适用于其中一个嵌套属性我的人物模型。
class Person
has_many :histories
accepts_nested_attributes_for :histories
end
class History
belongs_to :person
end
查看
<% @person.histories.each do |history| %>
<% if history.created_at != nil %>
<p>Date: <%= history.created_at.strftime("%a, %b %e %Y") %></p>
<p>Visit Summary: <%= history.visit_summary %></p>
<% else %>
<p>N/A</p>
<% end %>
<% end %>
<%= form_for @person do |p| %>
<%= p.fields_for :histories do |history| %>
<%= history.label :visit_summary %>
<%= history.text_area :visit_summary %>
<% end %>
<%= p.submit 'Create History Item' %>
<% end %>
我知道我已经制作了一些令人震惊的逻辑视图错误,但我基本上试图用这种形式完成的是当一个人导航到/ people /:id他们看到了这个人的摘要,包括与该人有关的历史。他们还有一个表格,可以将单个历史项目添加到人员历史集合中。
现在,为了让表单显示在视图中,我必须编辑我的控制器:
class PeopleController < ApplicationController
...
def show
@person = Person.find(person_params)
@person.histories.build
end
end
但是,调用histories.build创建的对象最终显示在视图中的历史记录项列表中,即使它尚未持久保存到数据库中,因此我的逻辑用于排除其created_at的历史记录项属性为零。此外,当我提交历史记录项并被重定向到/ people /:id时,我会看到两个表单字段;一个用于编辑我以前创建的历史记录项,另一个用于创建新的历史记录项。我只想在任何给定时间出现一个空的表单字段。
我的问题是:
1.。)如何在我的个人模型上为关联显示一个小的单一属性表单,以便在show.html.erb模板中显示?
2。)是否正在使用nested_attributes表单进行处理?
3。)是否可以提供在线文档,说明如何创建这些小型自定义表单?
非常感谢!
答案 0 :(得分:0)
创建一个新的历史记录对象,该对象尚未关联到visit_summary
输入post
histories#create
路由的人员对象和表单。在该路线中,使用输入参数创建新历史记录,然后将该人员分配给它,并保存
基本上,仅仅因为你有一个嵌套关联,并不意味着你不能自己创建一个历史对象。
在您的人员控制器中:
def show
@person = Person.find(person_params)
@history = History.new
end
你的表格
<%= form_for [@person, @history] do |f| %>
<%= f.label :visit_summary %>
<%= f.text_area :visit_summary %>
<%= f.submit 'Create History Item' %>
<% end %>
或者,如果您不想在@person
方法中使用form_for
,则可以使用隐藏字段代码:
<%= form_for @history do |f| %>
<%= f.hidden_field(:person_id, value: @person.id) %>
<%= f.label :visit_summary %>
<%= f.text_area :visit_summary %>
<%= f.submit 'Create History Item' %>
<% end %>
你的历史控制者
def create
history = History.new(history_params)
history.person = Person.find(params[:person_id])
history.save
...
end