我有两个模型,角色和统计。他们的关系是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 %>
提前感谢您的帮助。我已经用这种方式与模特联系了大约一个星期,而且我还是很沮丧,我仍然不理解。
答案 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。我希望它有所帮助。