Add tagged_ids to taggable

This commit is contained in:
chris 2013-05-03 10:01:26 +08:00
parent 167a71272a
commit aefd62da2a
3 changed files with 36 additions and 18 deletions

View File

@ -11,7 +11,7 @@ class Admin::AssetsController < OrbitBackendController
def new def new
@asset = Asset.new @asset = Asset.new
@asset_categories = AssetCategory.all @asset_categories = AssetCategory.all
@tags = AssetTag.all @tags = get_tags
respond_to do |format| respond_to do |format|
format.html {} format.html {}
format.js { render 'js/show_pop_up', :locals => {:partial => 'admin/assets/new'} } format.js { render 'js/show_pop_up', :locals => {:partial => 'admin/assets/new'} }
@ -21,7 +21,7 @@ class Admin::AssetsController < OrbitBackendController
def edit def edit
@asset = Asset.find(params[:id]) @asset = Asset.find(params[:id])
@asset_categories = AssetCategory.all @asset_categories = AssetCategory.all
@tags = AssetTag.all @tags = get_tags
respond_to do |format| respond_to do |format|
format.html {} format.html {}
format.js { render 'js/show_pop_up', :locals => {:partial => 'admin/assets/edit'} } format.js { render 'js/show_pop_up', :locals => {:partial => 'admin/assets/edit'} }
@ -46,7 +46,7 @@ class Admin::AssetsController < OrbitBackendController
else else
flash[:error] = t('create.fail') flash[:error] = t('create.fail')
@asset_categories = AssetCategory.all @asset_categories = AssetCategory.all
@tags = AssetTag.all @tags = get_tags
respond_to do |format| respond_to do |format|
format.js { format.js {
if params[:uploader] if params[:uploader]
@ -69,7 +69,7 @@ class Admin::AssetsController < OrbitBackendController
else else
flash[:error] = t('update.fail') flash[:error] = t('update.fail')
@asset_categories = AssetCategory.all @asset_categories = AssetCategory.all
@tags = AssetTag.all @tags = get_tags
respond_to do |format| respond_to do |format|
format.html { render :action => :edit } format.html { render :action => :edit }
format.js { render 'js/reload_pop_up', :locals => {:value => @asset, :values => nil, :partial => 'admin/assets/edit', :locals => {:is_html => false}} } format.js { render 'js/reload_pop_up', :locals => {:value => @asset, :values => nil, :partial => 'admin/assets/edit', :locals => {:is_html => false}} }
@ -96,7 +96,7 @@ class Admin::AssetsController < OrbitBackendController
def file_upload def file_upload
@asset = Asset.new @asset = Asset.new
@asset_categories = AssetCategory.all @asset_categories = AssetCategory.all
@tags = AssetTag.all @tags = get_tags
render :layout => false render :layout => false
end end

View File

@ -6,4 +6,12 @@ class Tagging
belongs_to :tag belongs_to :tag
belongs_to :taggable, polymorphic: true belongs_to :taggable, polymorphic: true
before_destroy :update_taggable_tag_ids
private
def update_taggable_tag_ids
self.taggable.remove_id(self.tag.id)
end
end end

View File

@ -13,17 +13,35 @@ module OrbitTag
def init_tag def init_tag
class_eval do class_eval do
field :tags_to_destroy, type: Array, default: [] field :tags_to_destroy, type: Array, default: []
field :tagged_ids, type: Array, default: []
has_many :taggings, as: :taggable, autosave: true, dependent: :destroy has_many :taggings, as: :taggable, autosave: true, dependent: :destroy
accepts_nested_attributes_for :taggings, allow_destroy: true accepts_nested_attributes_for :taggings, allow_destroy: true
after_save :remove_taggings, unless: Proc.new{self.tags_to_destroy.blank?} after_save :remove_taggings, unless: Proc.new{self.tags_to_destroy.blank?}
def remove_id(id)
self.class.without_callback(:save, :after, :remove_taggings) do
self.update_attribute(:tagged_ids, self.tagged_ids - [id.to_s])
end
end
def sorted_tags
if tags.blank?
[]
else
tag_array = tags.inject([]){ |result, value|
result << [value.name, value]
}
tag_array.sort.map{|x| x[1] }
end
end
def tags def tags
self.taggings.blank? ? [] : self.taggings.map{|t| t.tag} self.taggings.blank? ? [] : self.taggings.map{|t| t.tag}.compact
end end
def tags=(tag_ids) def tags=(tag_ids)
tag_ids = [tag_ids].flatten ids = [tag_ids].flatten
tag_ids.delete('') tag_ids.delete('')
ids = self.taggings.blank? ? [] : self.taggings.map{|t| t.tag.id} ids = self.taggings.blank? ? [] : self.taggings.map{|t| t.tag.id}
tag_ids.each do |tag_id| tag_ids.each do |tag_id|
@ -40,17 +58,9 @@ module OrbitTag
def tag_ids=(ids) def tag_ids=(ids)
self.tags = ids self.tags = ids
end ids = [ids].flatten
ids.delete('')
def sorted_tags self.tagged_ids = ids
if tags.blank?
[]
else
tag_array = tags.inject([]){ |result, value|
result << [value.name, value]
}
tag_array.sort.map{|x| x[1] }
end
end end
private private