Ошибка произошла при оценке nil.sort_by - PullRequest
0 голосов
/ 14 марта 2012

В моем article_controller у меня есть следующее определение

 def index
   @tags = Article.tag_counts_on(:keywords) || ''
   klass = Article
   klass = klass.tagged_with(@keyword) if (@keyword = params[:keyword]).present?
   @articles = klass.paginate(:page => params[:page])
   @articles = Article.where(:state => '4').paginate(:page => params[:page], :per_page => 10)
   respond_to do |format|
      format.html  # index.html.erb
      format.xml  { render :xml => @articles }
   end
end

и в моих представлениях / article / index.html.erb у меня есть код:

  <% @tags.sort_by(&:count).reverse.each do |k| %>
     <% url_opts = {:action => "index", :controller => "articles"}
       link_name = "#{k.name} (#{k.count})" %>
     <% if @keyword == k.name %>
        <%= link_to link_name, url_opts.merge(:keyword => nil), :class => "tag current_tag", :title => "Click again to see all" %>
     <% else %>
        <%= link_to link_name,  url_opts.merge(:keyword => k.name), :class => "tag", :title => "Click to filter by #{k.name}" %>
     <% end %>
  <% end %>

Я использую Ruby 1.9.2, Rails 3.0.11 и в Gemfile gem act-as-taggable-on и следующий код

 rails generate acts_as_taggable_on:migration

создание таблиц тегов и тегов

В моих журналах у меня есть эта ошибка:

Отображение статей / index.html.erb в макетах / приложении (57,4 мс) Выполнено 500 Внутренняя ошибка сервера в 189 мс

ActionView :: Template :: Error (У вас есть нулевой объект, когда вы этого не ожидали! Возможно, вы ожидали экземпляр Array. Ошибка произошла при оценке nil.sort_by)

Переменная @tags является массивом? и есть нулевой объект?

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Эта ошибка является распространенным в Rails (возможно, Ruby, на самом деле) конфузором, который просто означает, что @tags был нулевым, когда вы вызывали метод sort_by ... и я предполагаю, что ошибка пытается быть полезной, поскольку sort_by является методом массива.

Итак, почему @tags ноль? Запустите rails console (в каталоге вашего проекта) и выполните Article.tag_counts_on('something') - где 'something' - ключевое слово.

Возможно, вы имели в виду в первой строке получить ключевые слова из массива params?

@tags = Article.tag_counts_on(params[:keywords])

Также вам нужно разобраться со случаем, когда теги не найдены, верно?

0 голосов
/ 15 марта 2012

Окончательно решение этой ошибки для меня было: НЕ СУХОЙ.Когда я добавляю код из def index для def all на article_controller, моя проблема исчезает.

мой новый article_controller

        def index
    @tags = Article.tag_counts_on(:keywords)
    klass = Article
    klass = klass.tagged_with(@keyword) if (@keyword = params[:keyword]).present?
    @articles = klass.where(:state => '4').paginate(:page => params[:page])
    respond_to do |format|
        format.html  # index.html.erb
        format.xml  { render :xml => @articles }
    end
    end                

        def all            
    @tags = Article.tag_counts_on(:keywords)
    klass = Article
    klass = klass.tagged_with(@keyword) if (@keyword = params[:keyword]).present?
    @articles = klass.where(:state => ['3', '4']).search(params[:search]).order('accepted desc').paginate(:page => params[:page], :per_page => 10)
            respond_to do |format|
        format.html { render 'index' }
        format.xml  { render :xml => @articles }
    end
    end
...