在我的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)在189ms内完成了500个内部服务器错误
ActionView::Template::Error (您没有预料到的nil对象!您可能需要一个Array的实例。评估nil.sort_by时出错)
变量@tags是一个数组吗?并且有一个空的对象?
发布于 2012-03-15 04:10:20
这个错误是一个常见的Rails错误(实际上可能是Ruby ),它只是意味着在调用sort_by方法时@tags为零……我猜这个错误是为了有所帮助,因为sort_by是数组的一种方法。
那么,为什么@tags是nil呢?启动rails console (在项目目录中)并执行Article.tag_counts_on('something') --其中'something'是一个关键字。
也许您的意思是在第一行中从params数组中获取关键字?
@tags = Article.tag_counts_on(params[:keywords])此外,您还需要处理没有找到标记的情况,对吧?
发布于 2012-03-15 22:10:33
最后,对我来说,这个错误的解决方案是:不干。当在articles_controller上添加从def index到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
endhttps://stackoverflow.com/questions/9708804
复制相似问题