Acts_as_taggable confused


#1

Ahoy,

So i’ve installed the acts_as_taggable module and everything is fine,
but i’m a bit confused about this bit of code described in the API

"photo = Photo.new

splits and adds to the tags collection

photo.tag “wine beer alcohol”

don’t need to split since it’s an array, but replaces the tags

collection

trailing and leading spaces are properly removed

photo.tag [ 'wine ‘, ’ vodka’], :clear => true

photo.tag_names # => [ ‘wine’, ‘vodka’ ]

appends new tags with a different separator

the ‘wine’ tag won´t be duplicated

photo.tag_names << ‘wine, beer, alcohol’, :separator => ‘,’

The difference between +tag_names+ and +tags+ is that +tag_names+

holds an array of String objects, mapped from +tags+, while +tags+

holds the actual +has_and_belongs_to_many+ collection, and so, is

composed of +Tag+ objects.

photo.tag_names.size # => 4
photo.tags.size # => 4
"

How do i actually rig this up to my _form.rhtml so that I can add tags
to an item? The above code only seems to give static tags such as “wine
beer alchohol”


#2

Thanks again Jeff, you’re the man.

I had actually figured it out and came to post my findings :slight_smile:

In my actions NEW and EDIT _form.rhtml I added a field for tags

Tags for this Item
<%= text_field_tag( 'tags', '', "value" => "#{h @item.tag_names.join(" ")}") %>

I ran into some stringify_keys! issues, which is why it’s done this way.

And my items_controller was updated with an additional line to save the
tags

def update
@item = Item.find(params[:id])
@item.tag(params[:tags])
if @item.update_attributes(params[:item])
flash[:notice] = ‘Item was successfully updated.’
redirect_to :action => ‘show’, :id => @item
else
render :action => ‘edit’
end
end

Perhaps I should ad this to the wiki…


#3

Will Jessup wrote:

Thanks again Jeff, you’re the man.

I had actually figured it out and came to post my findings :slight_smile:

In my actions NEW and EDIT _form.rhtml I added a field for tags

Tags for this Item
<%= text_field_tag( 'tags', '', "value" => "#{h @item.tag_names.join(" ")}") %>

I ran into some stringify_keys! issues, which is why it’s done this way.

And my items_controller was updated with an additional line to save the
tags

def update
@item = Item.find(params[:id])
@item.tag(params[:tags])
if @item.update_attributes(params[:item])
flash[:notice] = ‘Item was successfully updated.’
redirect_to :action => ‘show’, :id => @item
else
render :action => ‘edit’
end
end

Perhaps I should ad this to the wiki…

Nice work!

One comment–

text_field_tag(name, value = nil, options = {})

The second parameter sets the starting value of the text field tag. Is
that what you’re doing with your third param?

text_field_tag ‘tags’, h(@item.tag_names.join(" > "))

might be a more direct way of doing it. Or does that have something to
do with the stringify_keys issue you mentioned?

Jeff C.man


#4

I did it that way because in the documentation, the 2nd variable does
something like

text_field_tag(one,two) # =>

But i need to also attach the .join(" ") and it wasn’t working out, so I
just set the value w/ the options parameter.

Will try your method and report back.

Nice work!

One comment–

text_field_tag(name, value = nil, options = {})

The second parameter sets the starting value of the text field tag. Is
that what you’re doing with your third param?

text_field_tag ‘tags’, h(@item.tag_names.join(" > "))

might be a more direct way of doing it. Or does that have something to
do with the stringify_keys issue you mentioned?

Jeff C.man


#5

<%= text_field_tag ‘tags’, h(@item.tag_names.join(" ")) %>

works great!

Why did you have a .join(" > “) instead of .join(” ") ?

Thanks


#6

Will Jessup wrote:

Ahoy,

So i’ve installed the acts_as_taggable module and everything is fine,
but i’m a bit confused about this bit of code described in the API

"photo = Photo.new

splits and adds to the tags collection

photo.tag “wine beer alcohol”

don’t need to split since it’s an array, but replaces the tags

collection

trailing and leading spaces are properly removed

photo.tag [ 'wine ‘, ’ vodka’], :clear => true

photo.tag_names # => [ ‘wine’, ‘vodka’ ]

appends new tags with a different separator

the ‘wine’ tag won´t be duplicated

photo.tag_names << ‘wine, beer, alcohol’, :separator => ‘,’

The difference between +tag_names+ and +tags+ is that +tag_names+

holds an array of String objects, mapped from +tags+, while +tags+

holds the actual +has_and_belongs_to_many+ collection, and so, is

composed of +Tag+ objects.

photo.tag_names.size # => 4
photo.tags.size # => 4
"

How do i actually rig this up to my _form.rhtml so that I can add tags
to an item? The above code only seems to give static tags such as “wine
beer alchohol”

I haven’t used acts_as_taggable, but one way to do it should be to
create a text field (perhaps done with text_field_tag rather than
text_field) called “tags”, then you’d handle the new tags in your create
and/or controller:

@item.tag params[:tags] unless params[:tags].blank?

This would add the new tags to your model @item (obviously replace this
with your proper model name) if the tags field wasn’t empty.

There may be a simpler way, but this is what looks good to me.

Jeff C.man


#7

Will Jessup wrote:

<%= text_field_tag ‘tags’, h(@item.tag_names.join(" ")) %>

works great!

Why did you have a .join(" > “) instead of .join(” ") ?

Thanks

Must have been just an artifact of copying quoted text. I think the
join came at the end of the line, and the > appeared at the start of the
quoted line. I thought that was odd at the time but didn’t look closely
enough at it to take it out. :slight_smile:

Glad it worked for you!

Jeff C.man