所以我正在创建一个博客,并尝试使用acts_as_taggable_on
entry
:category
,:subcategory
和:topic
。 entry
模型belongs_to :user
和acts_as_ordered_taggable/acts_as_ordered_taggable_on :category, :subcategory,
。
在entries_controller.rb
update
中:
@entry = Entry.find_by_id(params[:id])
if @entry.update_attributes(params[:entry])
redirect_to entries_path
else
render "edit"
end
当我向条目提交编辑时,我收到此错误:
> NoMethodError Exception: undefined method `each' for "test_category":String
在这种情况下,String 'test_category'
是我编辑:category
的值。
这与acts_as_taggable_on
有关吗?
class Entry < ActiveRecord::Base
belongs_to :user
# Paperclip
has_many :attached_assets, :dependent => :destroy
accepts_nested_attributes_for :attached_assets, :allow_destroy => true
# Acts_As_Taggable
acts_as_ordered_taggable
acts_as_ordered_taggable_on :category, :subcategory, :topic
validates_presence_of :title, :subtitle, :category, :post, :subcategory, :topic
attr_accessible :title, :subtitle, :category_list, :post, :subcategory_list, :topic_list, :asset, :asset_file_name, :asset_type, :entry_id
delegate :title?, :subtitle?, :category?, :post?, :subcategory?, :topic?, :to => :user
before_save :to_l
private
def to_l
self.category.downcase
end
end
class EntriesController < ApplicationController
before_filter :authenticate_action
def index
@entries = Entry.order("created_at desc")
end
def new
@entry = Entry.new
end
def show
@entry = Entry.find_by_id(params[:id])
end
def create
@entry = Entry.new(params[:entry])
if @entry.save
redirect_to entries_path
else
render "new"
end
end
def edit
@entry = Entry.find_by_id(params[:id])
end
def update
@entry = Entry.find_by_id(params[:id])
debugger
if @entry.update_attributes(params[:entry])
redirect_to entries_path
else
puts @entry.errors.messages.inspect
render "edit"
end
end
def destroy
@entry = Entry.find_by_id(params[:id])
@entry.destroy
redirect_to entries_path, :notice => "#{@entry.title} has been deleted"
end
end
> /Users/kyle/Projects/blog/app/controllers/entries_controller.rb:33
> if @entry.update_attributes(params[:entry])
> (rdb:135)
> {:category=>["can't be blank"], :subcategory=>["can't be blank"], :topic=>["can't be blank"]}
> Started PUT "/entries/4" for 127.0.0.1 at 2012-07-19 11:29:43 -0500
> Processing by EntriesController#update as HTML
> Parameters: {"utf8"=>"✓", "authenticity_token"=>"47zbADuuFS3xC5RFc6nLR7qUnE2bn1MZoNm0IwESCcI=", "entry"=>{"title"=>"Test 4", "subtitle"=>"Just Kidding!", "category_list"=>"test_category new", "subcategory_list"=>"test_subcategory new", "topic_list"=>"test_topic new", "post"=>"I pulled a George Lucas, sploops! \r\n\r\njfk;dajgk;dasjkgl;dasczcvzcVzcxv"}, "commit"=>"Update Entry", "id"=>"4"}
> User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 2]]
> Entry Load (1.1ms) SELECT "entries".* FROM "entries" WHERE "entries"."id" = 4 LIMIT 1
> (0.2ms) BEGIN
> ActsAsTaggableOn::Tag Load (0.7ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = 4 AND "taggings"."taggable_type" = 'Entry' AND (taggings.context = 'category' AND taggings.tagger_id IS NULL) ORDER BY taggings.id
> ActsAsTaggableOn::Tag Load (0.9ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = 4 AND "taggings"."taggable_type" = 'Entry' AND (taggings.context = 'subcategory' AND taggings.tagger_id IS NULL) ORDER BY taggings.id
> ActsAsTaggableOn::Tag Load (1.1ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = 4 AND "taggings"."taggable_type" = 'Entry' AND (taggings.context = 'topic' AND taggings.tagger_id IS NULL) ORDER BY taggings.id
> ActsAsTaggableOn::Tag Load (0.7ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = 4 AND "taggings"."taggable_type" = 'Entry' AND (taggings.context = 'category') ORDER BY taggings.id
> ActsAsTaggableOn::Tag Load (0.8ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = 4 AND "taggings"."taggable_type" = 'Entry' AND (taggings.context = 'subcategory') ORDER BY taggings.id
> ActsAsTaggableOn::Tag Load (0.7ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = 4 AND "taggings"."taggable_type" = 'Entry' AND (taggings.context = 'topic') ORDER BY taggings.id
> (0.2ms) ROLLBACK
> Rendered entries/_form.html.haml (49.3ms)
> Rendered entries/edit.html.haml within layouts/application (53.0ms)
> Completed 200 OK in 9380ms (Views: 91.8ms | ActiveRecord: 6.9ms)
答案 0 :(得分:2)
好的,我把事情搞定了。
首先,我在:category
中将:subcategory
,:topic
和:category_list
的出现替换为:subcategory_list
,:topic_list
和validates_presence_of
}和attr_accessible
。
acts-as-taggable-on
仍然需要acts-as-[ordered-]taggable
和acts-as-[ordered-]taggable-on :attr
作为原始列(即:category
,:subcategory
和{ {1}})正常运作! 你有没有抓到警告:以上?好。
然后我转到我的:topic
并用_form.html.haml
替换:category
的{{1}},:subcategory
和:topic
属性, f.text_field
和:category_list
。
就是这样!现在事情正在顺利进行!
另外,仅供参考,我在:subcategory_list
中配置了:topic_list
:
acts-as-taggable-on
我认为,做事情要简单得多的方法就是为我的......标签设置一个名为application.rb
的属性,而不是让三个单独的字段“充当可标记的”。所以,这是我回答这篇文章后所做的事情:
ActsAsTaggableOn.delimiter = ' ' # use space as delimiter
ActsAsTaggableOn.remove_unused_tags = true
ActsAsTaggableOn.force_lowercase = true
:tags
kyle-/blog: rails g migration RemoveCategoryFromEntry category:string
invoke active_record
create db/migrate/20120719214435_remove_category_from_entry.rb
kyle-/blog: rake db:migrate
== RemoveCategoryFromEntry: migrating ========================================
-- remove_column(:entries, :category)
-> 0.0141s
== RemoveCategoryFromEntry: migrated (0.0143s) ===============================
kyle-/blog: rails g migration RemoveSubcategoryFromEntry subcategory:string
invoke active_record
create db/migrate/20120719214845_remove_subcategory_from_entry.rb
kyle-/blog: rake db:migrate
== RemoveSubcategoryFromEntry: migrating =====================================
-- remove_column(:entries, :subcategory)
-> 0.0024s
== RemoveSubcategoryFromEntry: migrated (0.0025s) ============================
kyle-/blog: rails g migration RemoveTopicFromEntry topic:string
invoke active_record
create db/migrate/20120719214922_remove_topic_from_entry.rb
kyle-/blog: rake db:migrate
== RemoveTopicFromEntry: migrating ===========================================
-- remove_column(:entries, :topic)
-> 0.0020s
== RemoveTopicFromEntry: migrated (0.0021s) ==================================
kyle-/blog: rails g migration AddTagsToEntry tags:string
invoke active_record
create db/migrate/20120719215013_add_tags_to_entry.rb
kyle-/blog: rake db:migrate
== AddTagsToEntry: migrating =================================================
-- add_column(:entries, :tags, :string)
-> 0.0039s
== AddTagsToEntry: migrated (0.0040s) ========================================
class Entry < ActiveRecord::Base
belongs_to :user
# Paperclip
has_many :attached_assets, :dependent => :destroy
accepts_nested_attributes_for :attached_assets, :allow_destroy => true
# Acts_As_Taggable
acts_as_ordered_taggable
acts_as_ordered_taggable_on :tags
validates_presence_of :title, :subtitle, :post, :tag_list
attr_accessible :title, :subtitle, :tag_list, :post, :asset, :asset_file_name, :asset_type, :entry_id
delegate :title?, :subtitle?, :tags?, :post?, :to => :user
end
- if @entry.errors
- @entry.errors.messages.each do |message|
= message
= form_for @entry, :url => entry_path, :html => {:multipart => true} do |f|
= f.label :title, "Title"
= f.text_field :title
%br
= f.label :subtitle, "Subtitle"
= f.text_field :subtitle
%br
= f.label :tag_list, "Tags"
= f.text_field :tag_list
%br
= f.label :asset
= f.file_field :asset, :html => {:multiple => true, :name => "entry[attached_assets_attributes][][assset]"}
%br
= f.label :post, "Post"
= f.text_area :post
%br
= f.submit
我已删除%h1= @entry.title
%h2= @entry.subtitle
%h3= @entry.tag_list
%h4= @entry.updated_at
%entry
= @entry.post
= link_to "Back", entries_path
= render "disqus"
和def create
@entry = Entry.new(params[:entry])
if @entry.save
redirect_to entry_path(@entry), :notice => '#{@entry.title} has been created'
else
puts @entry.errors.messages.inspect
render 'new'
end
end
因为我决定使用逗号作为分隔符,因为ActsAsTaggableOn.delimiter = ' '
正在删除我正在测试的标记。
ActsAsTaggableOn.remove_unused_tags = true