在我的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是一个数组?并且没有任何对象?
答案 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