0

这是我的相关部分_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 %>

当我有一个用于创建 a 的泛型Score并且有一组通过控制器通过clients.

问题是当只有一条client记录时....比如说一个 URL,例如: myapp.com/client/6/scores/new/

鉴于我client_id在参数中有一个,它给了我一个零错误:

undefined method `collect' for nil:NilClass

如何为一条@client记录解决这个问题?

4

1 回答 1

1

看起来您正在使用嵌套资源,因此应该调用myapp.com/client/6/scores/new/您的new方法。ScoreController

在此方法中(或在前过滤器中),我假设您有一行类似于:

@client = Client.find(params[:client_id])

现在,如果您想按照构建的方式使用您的部分,您要么必须确保有一个对象响应collect名称为的方法(即数组),@clients要么您可以继续重写您的部分和拆分它分成if几部分左右......

您收到的错误消息基本上意味着,当ScoreController#new方法被渲染时,没有调用任何对象,@clients因此它是 nil,并且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 ]

现在,我不确定这是一个优雅的解决方案,但它应该让你继续......

于 2012-10-12T12:03:43.017 回答