Rails:需要帮助在另一个模型的视图中显示一个form_for一个模型

时间:2011-05-07 16:26:21

标签: ruby-on-rails view model form-for

我有两个模型,角色和统计。他们的关系是Character has_one Statistic and Statistic belongs_to Character。

我为这两个模型生成了支架,我想要做的是能够创建一个新的统计数据,如果没有存在,显示统计模型和编辑统计模型,所有这些都来自于角色视图。我不确定如何编辑控制器或在视图中编写代码以实现此目的。

这里有一些代码。从角色视图:

<h2>Statistics</h2>
<%= render "statistics/form" %>

然而,这给了我这个错误:

undefined method `build' for nil:NilClass
Extracted source (around line #1):

1: <%= form_for ([@character, @character.statistic.build]) do |f| %>
2:   <% if @statistic.errors.any? %>
3:     <div id="error_explanation">
4:       <h2><%= pluralize(@statistic.errors.count, "error") %> prohibited this statistic from being saved:</h2>

所以我假设我没有正确写好第一行?我认为这样可行,因为我希望Statistic的每个实例都属于一个角色,这会产生这种关系。

这是来自Statistics / form的代码:

<%= form_for ([@character, @character.statistic.build]) do |f| %>
<% if @statistic.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@statistic.errors.count, "error") %> prohibited this statistic from                 
being saved:</h2>

<ul>
<% @statistic.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>

<div class="field">
<%= f.label :strength %><br />
<%= f.text_field :strength %>
...
<div class="field">
<%= f.label :charisma %><br />
<%= f.text_field :charisma %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>

提前感谢您的帮助。我已经用这种方式与模特联系了大约一个星期,而且我还是很沮丧,我仍然不理解。

2 个答案:

答案 0 :(得分:1)

您可以在字符表单中包含统计字段,并自动创建关联,但过程不同。

首先在Character模型中使用accepts_nested_attributes_for

has_one :statistic
accepts_nested_attributes_for :statistic

并在您的角色形式中使用fields_for

<%= form_for @character do |f| %>

  ... all your character fields as generated in your scaffold

  <%= f.fields_for :statistic do |statistic_fields| %>
    ... all your statistic fields using statistic_fields as form object, ie:
    <%= statistic_fields.label :strength %><br />
    <%= statistic_fields.text_field :strength %>
    ...
  <% end %>
  <%= f.submit %>
<% end %>

修改:如果您想要分开表单,仍然可以使用部分内容:

将统计信息表单更改为以下内容:

<%= form_for @statistics do |f| %>
  <%= render :partial => "statistics/fields", locals => {:f => f} %>
<% end %>

创建一个统计字段partial app/views/statistic/_fields.html.erb,其中包含以前格式中的所有字段:

<div class="field">
<%= f.label :strength %><br />
<%= f.text_field :strength %>
...

然后您可以重复使用字符形式中的统计字段:

<%= form_for @character do |f| %>
  ...
  <%= f.fields_for :statistic do |statistic_fields| %>
    <%= render :partial => "statistics/fields", locals => {:f => statistic_fields} %>
  <% end %>
  <%= f.submit %>
<% end %>

答案 1 :(得分:0)

对于has_one关系,构建和创建的调用方式与has_many不同。

使用has_many @ character.statistic.build可以使用,但是使用has_one时,需要这样做:

@ character.build_statistic和.create_statistic

我掀起了一个测试它的应用程序,然后把它扔给了Github。我希望它有所帮助。

https://github.com/unixmonkey/Manticore_example