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,您也可以访问结果。更具体地说,看看您调用方括号运算符的地方,[]因为错误是由其中一个引起的。

编辑:在聊天讨论后,我们发现了问题。首先在控制器 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

即检查是否只创建一本新书并在找到一本书时设置其属性。现在在视图中,应该添加一个检查以仅渲染视图的其余部分(如果结果不为空,则调用[]运算符的部分@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是空的,则不应尝试致电接线员。新版本在 else 情况下只显示页面的剩余部分,即 if@results不为空。

希望这可以说清楚。

于 2013-01-12T14:10:56.987 回答