When I have a relation such as:
class Programmer < ActiveRecord::Base
has_many :projects
has_many :assignments, :through => :projects
acts_as_taggable
end
class Assignment < ActiveRecord::Base
has_many :projects
has_many :programmers, :through => :projects
end
Entering both programmer and assignment data in a single form requires me to have a nested form. Why is it that when I have a field for tags, tags doesn't need to be in a nested form?
for example, this doesn't work
<%= form_for(@programmer) do |p| %>
&l开发者_StackOverflow社区t;%= p.label :name %><br />
<%= p.text_field :name %><br />
<%= p.label :assignments %><br />
<%= p.text_field :assignments %><br />
<%= p.submit %>
<% end %>
but why does this work?
<%= form_for(@programmer) do |p| %>
<%= p.label :name %><br />
<%= p.text_field :name %><br />
<%= p.label :tag_list %><br />
<%= p.text_field :tag_list %><br />
<%= p.submit %>
<% end %>
The less detailed answer is that acts_as_taggable_on handles tag creation when you use tag_list=
.
An example IRB session:
$> photo = Photo.last
$> photo.tag_list # ['outer space', 'andromeda']
$> photo.tag_list = "outer space, andromeda, galaxy"
$> photo.tag_list # ['outer space', 'andromeda', 'galaxy']
$> photo.save
# checks the db for existing outer space, andromeda, and
# galaxy tags on the photo, creates any missing ones,
# deletes any ones it previously had but you didn't specify
acts_as_taggable_on can reasonably implement this behavior in this method because the library can assume you're wanting to check for dups, and delete anything you didn't provide. To do this by default on any generic association would be bad :)
精彩评论