我似乎无法从我的api调用中捕获零响应,当没有结果时我收到此错误
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>
关于它可能是什么的任何想法
由于
答案 0 :(得分:1)
如果@results
为零,则后一版本将返回true。你在其他地方还有其他一些错误。
如果错误仍然显示,那么即使@results.nil?
返回true,您也可以访问结果。更具体地说,看看你调用方括号运算符[]
的地方,因为错误是由其中一个引起的。
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语句实现的:< / p>
<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
不为空。
希望这说清楚。