在show.html.erb中创建嵌套属性表单

时间:2015-05-08 20:36:03

标签: ruby-on-rails forms

我熟悉如何在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。)是否可以提供在线文档,说明如何创建这些小型自定义表单?

非常感谢!

1 个答案:

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