Как изменить частичную форму для обработки ассоциации has_one?
Это актуальная часть моего _form.html.erb
<%= form_for(@score) do |f| %>
<% if @score.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@score.errors.count, "error") %> prohibited this score from being saved:</h2>
<ul>
<% @score.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :client_id %><br />
<%= f.select :client_id, @clients.collect { |c| [c.name, c.id] }, {:include_blank => 'None'} %>
</div>
<div class="field">
<%= f.label :firm_size %><br />
<%= f.text_field :firm_size %>
</div>
.
.
.
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Эта часть работает, когда у меня есть универсальный для создания Score
и есть коллекция клиентов, переданных через контроллер через clients
,
Проблема в том, когда есть только один client
запись.... скажем для URL, как:myapp.com/client/6/scores/new/
Учитывая, что у меня есть client_id
в параметрах это дает мне нулевую ошибку:
undefined method `collect' for nil:NilClass
Как мне решить это за один @client
запись?
1 ответ
Похоже, вы используете вложенные ресурсы, поэтому в случае myapp.com/client/6/scores/new/
ваш new
метод в вашем ScoreController
должен быть назван.
В этом методе (или в фильтре before) я предполагаю, что у вас есть строка, похожая на:
@client = Client.find(params[:client_id])
Теперь, если вы хотите использовать ваш частичный способ так, как ваш, вы должны убедиться, что есть объект, который отвечает на метод collect
(т.е. массив) с именем @clients
или вы могли бы пойти дальше и переписать свой частичный и разделить его на if
разделы или около того...
Сообщение об ошибке в основном означает, что когда ScoreController#new
метод оказывается нет объекта под названием @clients
поэтому ноль, а NilClass
не имеет метода collect
Так что я бы просто сделал следующее в вашем ScoreController#new
метод:
# get your single client
@client = Client.find(params[:client_id])
# and simply put it in an array with the name your partial uses
@clients = [ @client ]
Я не уверен, что это элегантное решение, но оно должно вас поддерживать...