Rails: нужна помощь в отображении формы для одной модели в представлении другой модели - PullRequest
2 голосов
/ 07 мая 2011

У меня есть две модели, Персонаж и Статистика. Их взаимосвязь: Персонаж has_one. Статистика и Статистика принадлежит_Символу.

Я сгенерировал каркасы для обеих моделей, и я хочу создать новую Статистику, если ее нет, отобразить Статистическую модель и отредактировать Статистическую модель, все из представления символов. Я не уверен, как редактировать контроллеры или писать код в представлении, чтобы это произошло.

Вот код. Из представления символов:

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

Итак, я предполагаю, что первая строка написана неправильно? Я подумал, что это сработает, поскольку я хочу, чтобы каждый экземпляр статистики принадлежал одному персонажу, и это создаст эти отношения.

Вот код из статистики / формы:

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

1 голос
/ 07 мая 2011

Вы можете включить статистические поля в форму вашего персонажа и создать ассоциацию автоматически, но процесс другой.

Первое использование accepts_nested_attributes_for в вашей Character модели:

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 %>
0 голосов
/ 10 мая 2011

Сборка и создание для отношений has_one вызываются иначе, чем для has_many.

С has_many @ character.statistic.build работает, но с has_one это нужно сделать так:

@character.build_statistic и .create_statistic

Я запустил приложение, чтобы проверить его, и бросил его на Github для вас. Надеюсь, это поможет.

https://github.com/unixmonkey/Manticore_example

...