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

この部分は、を作成するためのジェネリックがScoreあり、を介してコントローラーを介して渡されるクライアントのコレクションがある場合に機能しますclients

問題は、clientレコードが1つしかない場合です。たとえば、次のようなURLの場合です。 myapp.com/client/6/scores/new/

client_idparamsにが含まれているとすると、nilエラーが発生します。

undefined method `collect' for nil:NilClass

@clientこれを1つのレコードで解決するにはどうすればよいですか?

4

1 に答える 1

1

ネストされたリソースを使用しているように見えるので、メソッドの場合はをmyapp.com/client/6/scores/new/呼び出すnew必要ScoreControllerがあります。

このメソッド(またはbeforeフィルター)では、次のような行があると想定しています。

@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 に答える