0

API呼び出しからnil応答をキャプチャできないようです。結果がない場合、このエラーが発生します

undefined method `[]' for nil:NilClass

これが発生した場合、「本が見つかりません」などのメッセージを表示したいので、これらを試しました

 <% if @results.empty? %>
 <% if @results.nil? %>
 <% if @results.nil %>

しかし、どれもエラーをキャプチャしません

コントローラ

def results
results = book_search(params[:search])
@results = results
@book = Book.new
@book.author = results.first["artistName"]
@book.bookname = results.first["trackName"]
@book.image = results.first["artworkUrl100"].gsub("100x100-75.jpg", "200x200-75.jpg")
@book.description = results.first["description"]
end

意見

<div class="container">
 <div class="row">
  <div class="span8 offset2">
   <% if @results.nil? %>
    <h1 class="resultTitle">sorry we can't find anything for that book.</h1>
     <%= link_to "Back To Search", root_path, :class => 'backButton' %>
   <% end %>


  <%= @results.first["trackName"] %> <br>
  <img src =<%= @results.first["artworkUrl100"] %>> <br>
  <%= @results.first["artistName"] %> <br>
  <%= truncate(remove_tags(@results.first["description"]), :length => 250) %> <br>

  <%= form_for @book do |f| %>
  <%= f.label :category_id, "Category" %>
  <%= f.collection_select(:category_id, Category.all, :id, :name, :prompt => 'Please select a Category') %>
  <%= f.hidden_field :author %>
  <%= f.hidden_field :bookname %>
  <%= f.hidden_field :image %>
  <%= f.hidden_field :description %>

   <%= f.submit 'Save book' %>
  <% end %>
 </div>
 </div>
 </div>

それが何であるかについてのアイデア

ありがとう

4

1 に答える 1

1

後者のバージョン@resultsは、nil の場合に true を返します。他の場所に他のエラーがあります。

それでもエラーが表示される場合は、 @results.nil?true が返された場合でも結果にアクセスします。より具体的には、角かっこ演算子を呼び出す場所を見てください[]。エラーはそれらの 1 つによって引き起こされます。

編集: チャットで議論した後、問題を発見しました。最初にコントローラ book_search が空の配列を返し、次にresults.first["artistName"]これを呼び出すとエラーが発生します。これは、results.first が nil であるためです。そのため、これを修正するために、コントローラーに以下を追加しました。

  def results
    results = book_search(params[:search])
    @results = results 
    unless @results.empty?
      @book = Book.new 
      @book.author = results.first["artistName"] 
      @book.bookname = results.first["trackName"] 
      @book.image = results.first["artworkUrl100"].gsub("100x100-75.jpg", "200x200-75.jpg") 
      @book.description = results.first["description"] 
    end
  end

つまり、新しいブックのみを作成し、ブックが見つかった場合にそのプロパティを設定するためのチェックです。ビューでは、残りのビュー (結果が空でない場合[]に演算子 onを呼び出す部分) のみをレンダリングするためのチェックを追加する必要が@resultsあります。これは、else ステートメントを使用して実現されます。

 <div class="container">
 <div class="row">
  <div class="span8 offset2">
   <% if @results.empty? %>
    <h1 class="resultTitle">sorry we can't find anything for that book.</h1>
     <%= link_to "Back To Search", root_path, :class => 'backButton' %>
   <% else %>  <--- I've putted an else instead of end here!!!


    <%= @results.first["trackName"] %> <br>
    <img src =<%= @results.first["artworkUrl100"] %>> <br>
    <%= @results.first["artistName"] %> <br>
    <%= truncate(remove_tags(@results.first["description"]), :length => 250) %> <br>

    <%= form_for @book do |f| %>
    <%= f.label :category_id, "Category" %>
    <%= f.collection_select(:category_id, Category.all, :id, :name, :prompt => 'Please select a Category') %>
    <%= f.hidden_field :author %>
    <%= f.hidden_field :bookname %>
    <%= f.hidden_field :image %>
    <%= f.hidden_field :description %>

     <%= f.submit 'Save book' %>
    <% end %>
  <%end %> <--- Added an end for the if-else here.
 </div>
 </div>
 </div>

そのため、コードで示した else と end を追加しました。なぜそれをする必要があるのですか?チェックを実行してメッセージを表示した後でも、ページの残りの部分がまだ評価されていて、このビット:%= @results.first["trackName"] %> <br>がエラーの原因だったからです。が空である[]ことがわかっている場合は、オペレーターに電話をかけないでください。@results新しいバージョンでは、ページの残りの部分のみが表示されます。つまり、@results空でない場合です。

これが明確になることを願っています。

于 2013-01-12T14:10:56.987 に答える