acts_as_taggable undefined方法'each'错误

时间:2010-07-20 21:20:47

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

我正在尝试使用acts_as_taggable插件在我的ruby on rails应用程序中包含标记功能。我附上了代码。我已经安装了插件并运行了迁移。我收到以下错误。

undefined method `each' for "value of the parameter":String

代码

location.rb - 位置表有名称,标签(这是我在表格中添加的一个字段,我在了解插件之前添加了它:),城市字段

class Location < ActiveRecord::Base
  belongs_to :profile
  acts_as_taggable
end

profile.rb

class Profile < ActiveRecord::Base
  has_many :locations
  acts_as_tagger
end

location_controller.rb

def create
  @location = Location.new(params[:location])
  @location.tag_list = ["tags1","tags2"]
  if @location.save
     redirect_to(@location)
  else
     redirect_to(@profile)
  end 
end

应用程序跟踪

/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:320:in `replace'
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/associations.rb:1331:in `block in collection_accessor_methods'
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2906:in `block in assign_attributes'
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `each'
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `assign_attributes'
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2775:in `attributes='
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2473:in `initialize'
/Users/felix/rails_projects/sample_app/app/controllers/locations_controller.rb:92:in `new'
/Users/felix/rails_projects/sample_app/app/controllers/locations_controller.rb:92:in `create'

由于

4 个答案:

答案 0 :(得分:3)

您是否有机会使用Ruby 1.9?这个答案的其余部分以“是”开头。如果是这样,请继续阅读。

你可能偶然发现了1.9的行为变化。 1.9中的字符串不再支持each(即它们不像Ruby 1.8那样Enumerable)。但是你可以使用each_char这可能是预期的。

如果这不是你的代码爆炸,那么你可以:

  • 返回1.8.x(明显)
  • 通过添加方法each(凌乱且可能危险)
  • 来破解String类
  • 修复导致问题的gem或插件。

关于所有这些here

,有一篇很棒的文章

答案 1 :(得分:0)

我猜,因为我不确定params中的值是什么(也许你可以输出params.inspect来得到它们);我认为你在params [:location]中传递给Location.new的值是一个字符串,它期待一个键值对的散列。

也许你的意思是:Location.new(:location => params[:location])

或者:Location.new(params)

或者Location.new(params[:location]) 可能是正确的,但它不是应该的哈希(通常由您的视图代码中的表单助手为您完成)。

答案 2 :(得分:0)

我有一个类似的问题,act_as_taggable抱怨每个方法未定义,问题是我在视图_form中有错误的字段。我有:

<%= f.text_field :tags %>

而不是应该是:

<%= f.text_field :tag_list %>

答案 3 :(得分:0)

尝试替换@location.tag_list = ["tags1","tags2"]

@location.tag_list = "tags1, tags2"

你也可以像这样添加标签

@location.tag_list.add("tag1, tag2", parse: true)

检查this cast了解更多信息