Удаление тегов из этого атрибута `tag_names`, когда они удаляются из поля ввода? - PullRequest
0 голосов
/ 05 марта 2012

У меня есть тег модель:

class Tag < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy  
  has_many :posts, :through => :taggings
  has_many :subscriptions
  has_many :subscribed_users, :source => :user, :through => :subscriptions
end

и Пост модель:

class Post < ActiveRecord::Base
  attr_accessible :title, :content, :tag_names

  belongs_to :user

  has_many :taggings, :dependent => :destroy
  has_many :tags, :through => :taggings

  attr_writer :tag_names
  after_save :assign_tags

  def tag_names
    @tag_names || tags.map(&:name).join(' ')
  end

  private

  def assign_tags
    return if @tag_names.blank?
    @tag_names.split(" ").each do |name|
      tag = Tag.find_or_create_by_name(name)
      self.tags << tag unless tags.include?(tag)
    end
  end
end

Метод assign_tags сохраняет сохраненные теги в :tag_names и отображает их в поле ввода следующим образом: tag1 tag2 tag3 (значения разделены пробелами).

просмотры / сообщения / _form.html.erb:

  <div class="field">
    <%= f.label :tag_names %><br />  
    <%= f.autocomplete_field :tag_names, autocomplete_tag_name_posts_path, :"data-delimiter" => ' '%>
  </div>

Как видите, assign_tags, позволяет мне добавлять / выдвигать теги к tag_names. Но если я удалю тег из поля ввода и сохраню. Тег все равно будет отображаться.

Любые предложения, чтобы помочь мне решить эту проблему?

(Может быть, tag_names должен просто очистить себя, прежде чем теги будут введены. Но не знаю, как это кодировать).

1 Ответ

1 голос
/ 05 марта 2012

Перед назначением тегов вы хотите очистить теги для этого элемента. например,

def assign_tags
  self.tags = []
  return if @tag_names.blank?
  @tag_names.split(" ").each do |name|
    tag = Tag.find_or_create_by_name(name)
    self.tags << tag unless tags.include?(tag)
  end
end

Обновление:

Или метод, который немного ударит по базе данных:

def assign_tags
  ntags = []
  @tag_names.to_s.split(" ").each do |name|
    ntags << Tag.find_or_create_by_name(name)
  end
  self.tags = ntags
end

Если вы хотите по-настоящему сойти с ума с парадигмой «меньше пишите больше», вы можете сделать:

def assign_tags
  self.tags = @tag_names.to_s.split(" ").inject([]) do |arr, name|
    arr << Tag.find_or_create_by_name(name)
    arr
  end
end

В качестве альтернативы, я бы порекомендовал посмотреть на акт-как-пометить-на драгоценный камень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...