При работе с владельцем модель taggable получает свои теги немного по-другому. Без права собственности он может получить свои теги так:
@photo.tag_list << 'a tag' # adds a tag to the existing list
@photo.tag_list = 'a tag' # sets 'a tag' to be the tag of the @post
Однако обе эти операции создают taggins
, чьи tagger_id
и tagger_type
равны nil
.
Чтобы установить эти поля, вы должны использовать этот метод:
@user.tag(@photo, on: :tags, with: 'a tag')
Предположим, вы добавили эту строку к create/update
действиям вашего PhotosController
:
@user.tag(@photo, on: :tags, with: params[:photo][:tag_list])
Это создаст две метки (одна с * 1018 и одна без tagger_id/_type
), потому что params[:photo][:tag_list]
уже включен в photo_params
. Поэтому, чтобы избежать этого, просто не включайте белый список :tag_list
.
Для Rails 3 - удалить :tag_list
из attr_accessible
.
Для Rails 4 - удалить :tag_list
из params.require(:photo).permit(:tag_list)
.
В конце ваше create
действие может выглядеть так:
def create
@photo = Photo.new(photo_params) # at this point @photo will not have any tags, because :tag_list is not whitelisted
current_user.tag(@photo, on: :tags, with: params[:photo][:tag_list])
if @photo.save
redirect_to @photo
else
render :new
end
end
Также обратите внимание, что при пометке объектов таким способом вы не можете использовать обычный метод tag_list
для извлечения тегов фотографии, поскольку он ищет taggings
, где tagger_id IS NULL
. Вы должны использовать вместо
@photo.tags_from(@user)
В случае, если ваш тегируемый объект belongs_to
для одного пользователя, вы также можете использовать all_tags_list
.