捕获nil对象并渲染视图

时间:2013-01-12 14:08:15

标签: ruby-on-rails ruby-on-rails-3

我似乎无法从我的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>

关于它可能是什么的任何想法

由于

1 个答案:

答案 0 :(得分:1)

如果@results为零,则后一版本将返回true。你在其他地方还有其他一些错误。

如果错误仍然显示,那么即使@results.nil?返回true,您也可以访问结果。更具体地说,看看你调用方括号运算符[]的地方,因为错误是由其中一个引起的。

编辑:在聊天讨论后我们发现了问题。首先在conroller中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语句实现的:< / 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不为空。

希望这说清楚。