Как изменить частичную форму для обработки ассоциации 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 ]

Я не уверен, что это элегантное решение, но оно должно вас поддерживать...

Другие вопросы по тегам