Как применить теги с act_as_taggable_on, используя флажки? - PullRequest
6 голосов
/ 17 декабря 2010

Я хотел бы назначить два разных «типа» тегов (категории секторов и бесплатные теги) для модели компании, используя acts_as_taggable_on . NB: я новичок в RoR!

Это легко сделать, если просто использовать стандартные поля ввода текста, но я хотел бы использовать флажки для одного типа (фиксированный тег категории сектора, который предопределен), а затем разрешить пользователю добавлять разделенные запятыми теги в поле ввода.

Я разобрался с этой проблемой по-разному, ... вдохновлен этим вопросом ... но я не могу заставить ее работать

Вот что у меня есть:

# models/company.rb
class Company ...
  acts_as_taggable_on :tags, :sectors

  has_many :taggings,
           :as => :taggable,
           :include => :tag,
           :class_name => "ActsAsTaggableOn::Tagging",
           :conditions => { :taggable_type => "Company" }

  has_many :sector_tags, 
           :through => :taggings, 
           :source => :tag,
           :class_name => "ActsAsTaggableOn::Tag",
           :conditions => {:context => "sectors"}
end

в форме (используя гем simple_form) У меня есть ...

# views/companies/_form.html.haml
= simple_form_for @company do |f|
  = f.input :name
  = f.association :sector_tags, :as => :check_boxes, :hint => "Please click all that apply"
  = f.input :tag_list
  = f.button :submit, "Add company"

А в контроллере моей компании у меня есть

# controllers/companies_controller.rb
def create
  @company = current_user.companies.build(params[:company])
  if @company.save
  ...
end

Но это вызывает ошибку проверки:

ActiveRecord::RecordInvalid in CompaniesController#create
Validation failed: Context can't be blank

Может кто-нибудь намекнуть, как я могу сделать это правильно?

Смежный вопрос: это хороший способ сделать это вообще? Было бы лучше, если бы я использовал модель категории для присвоения секторных тегов через объединенную модель?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 02 февраля 2011

Ну, я решил свою проблему.И это оказалось довольно просто.Увы, я закончил тем, что создал отдельную модель Сектора через объединенную таблицу «секторизаций».Но если кому-то интересно, я просто хотел бы рассказать о том, что я сделал в случае выше ...

В моей компании модель

# models/company.rb
class Company ...
  acts_as_taggable_on :tags, :sectors
...
end

в форме

# views/companies/_form.html.haml
= simple_form_for @company do |f|
  = f.input :name
  = f.input :sector_list, :as => :check_boxes, :collection => @sectors, :hint => "Please check all that apply"
  = f.input :tag_list
  = f.button :submit, "Add company"

и в контроллере фирмы (создать)

# controllers/company_controllers.rb
def new
  @company = Company.new
  @sectors = get_sectors
end

def get_sectors
  sectors = []
  for sector in Company.sector_counts
    sectors << sector['name']
  end
  return sectors
end
1 голос
/ 29 мая 2013

Кажется, что act_as_taggable_on использует наследование одной таблицы, поэтому вам не нужно создавать никаких дополнительных таблиц.Однако вам нужно следовать их соглашению (которое они никогда не указывали) следующим образом:

//add to model
attr_accessible :yourfieldname_list
acts_as_taggable_on :yourfieldname

//view
<%= f.text_field :yourfieldname_list %>
...