【问题标题】:The error occurred while evaluating nil.sort_by评估 nil.sort_by 时发生错误
【发布时间】:2012-03-14 19:27:54
【问题描述】:

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

在我的意见/文章/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) 在 189 毫秒内完成 500 个内部服务器错误

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

变量@tags 是一个数组?并且有一个 nil 对象?

【问题讨论】:

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


    【解决方案1】:

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

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

    也许您的意思是在第一行中从 params 数组中获取关键字?

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

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

    【讨论】:

    • 可能你是对的。在控制台中写入 Article.tag_counts_on(:keyworld) 时,我取一个空哈希:=> []。为什么会这样,我现在不知道。我认为 gem 处理表标签,因此我创建了文件 app/models/tag.rb 和 app/models/tagging.rb 因此我的错可能在表标签上。
    【解决方案2】:

    最后对我来说这个错误的解决方案是:NOT DRY。当添加代码时 def 索引到 def all onarticles_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
    

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2011-09-23
      • 1970-01-01
      相关资源
      最近更新 更多