在评估nil.sort_by时发生错误

时间:2012-03-14 19:27:54

标签: ruby-on-rails-3 acts-as-taggable-on

在我的articles_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

在我的views / articles / 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.4ms) 在189ms完成500内部服务器错误

ActionView :: Template :: Error(当你没想到它时,你有一个nil对象! 您可能期望一个Array实例。 评估nil.sort_by时发生错误

变量@tags是一个数组?并且没有任何对象?

2 个答案:

答案 0 :(得分:1)

这个错误是一个常见的Rails(可能是Ruby,实际上)混淆,当你调用@tags方法时,只是意味着sort_by为nil ...我猜这个错误试图提供帮助,因为sort_by是Array的一种方法。

那么,为什么@tags为零呢?启动rails console(在您的项目目录中)并执行Article.tag_counts_on('something') - 其中'something'是关键字。

也许你想在第一行中从params数组中获取关键字?

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

另外,你需要处理没有找到标签的情况,对吗?

答案 1 :(得分:0)

最终,对我来说这个错误的解决方案是:不干。从中添加代码时 def index to 在articles_controller上def all我的问题消失了。

我的新articles_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