2

我有两个模型,字符和统计。它们的关系是 Character has_one Statistic 和 Statistic belongs_to Character。

我已经为这两个模型生成了脚手架,我想要做的是能够在不存在的情况下创建一个新的 Statistic,显示 Statistic 模型并编辑 Statistic 模型,所有这些都来自 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 的每个实例都属于一个角色,这会创建这种关系。

这是来自统计/表格的代码:

<%= 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 %>

提前感谢您的帮助。大约一周以来,我一直在努力以这种方式关联模型,但我很沮丧,因为我仍然不理解。

4

2 回答 2

1

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

首先在模型中使用accepts_nested_attributes_forCharacter

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 %>

创建一个统计字段部分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 %>
于 2011-05-07T16:57:02.443 回答
0

has_one 关系的 Build 和 create 调用方式与 has_many 不同。

使用 has_many @character.statistic.build 有效,但使用 has_one,需要这样做:

@character.build_statistic 和 .create_statistic

我开发了一个应用程序来测试它,并在 Github 上为您提供。我希望它有所帮助。

https://github.com/unixmonkey/Manticore_example

于 2011-05-10T03:39:40.867 回答