0

次のような関係がある場合:

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

プログラマと割り当てデータの両方を 1 つのフォームに入力するには、ネストされたフォームが必要です。タグ用のフィールドがある場合、タグをネストされた形式にする必要がないのはなぜですか?

たとえば、これは機能しません

<%= form_for(@programmer) do |p| %>
    <%= p.label :name %><br />
    <%= p.text_field :name %><br />
    <%= p.label :assignments %><br />
    <%= p.text_field :assignments %><br />
    <%= p.submit %>
<% end %>

しかし、なぜこれが機能するのですか?

<%= 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 %>
4

1 に答える 1

0

あまり詳細ではない答えは、acts_as_taggable_on が使用時にタグの作成を処理するというものtag_list=です。

IRB セッションの例:

$> 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

act_as_tggable_on は、このメソッドでこの動作を合理的に実装できます。これは、ライブラリが重複をチェックして、提供していないものをすべて削除したいと想定できるためです。一般的な関連付けでデフォルトでこれを行うのは悪いことです:)

于 2011-11-05T05:58:55.307 に答える