6

Me gustaría asignar dos "tipos" de etiquetas diferentes (categorías de sector y etiquetado libre) a un modelo de compañía que usa acts_as_taggable_on. NB: ¡Soy nuevo en RoR!¿Cómo aplicar etiquetas con acts_as_taggable_on usando casillas de verificación?

Esto es fácil de hacer solo con campos de entrada de texto estándar, pero me gustaría usar casillas de verificación en un tipo (una etiqueta de categoría de sector fija que está predefinida) y luego permitir que el usuario agregue etiquetas separadas por comas en un campo de entrada.

he jugado un poco con este problema de varias maneras, ... uno inspirado por this question ... pero no puedo conseguir que funcione

Esto es lo que tengo hasta ahora:

# 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 

en la forma (usando joya simple_form) tengo ...

# 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" 

Y en mi controlador de la empresa tengo

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

Pero esto provoca un error de validación:

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

Puede cualquier alusión a cómo puedo hacer esto bien?

Una pregunta relacionada es si esta es una buena manera de hacerlo. ¿Sería mejor que solo usara un modelo de Categoría para asignar etiquetas sectoriales a través de un modelo conjunto?

Gracias!

Respuesta

7

Bueno, he resuelto mi problema. Y resultó ser bastante simple. Desgraciadamente, terminé creando un modelo de Sector por separado a través de una tabla conjunta de "sectorizaciones". Pero si alguien está interesado, sólo quería poner al día en lo que hice en el caso anterior ...

En mi modelo de empresa

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

en forma

# 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" 

y en el controlador de empresa (crear)

# 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 
+5

Tu método puede ser el siguiente: def get_sectors; Company.sector_counts.collect (&: name); fin –

1

parece que act_as_taggable_on utiliza la herencia simple mesa, por lo que actu aliado no es necesario crear ninguna tabla adicional. Sin embargo, es necesario que sigas su convención (que nunca dijeron) de la siguiente manera:

//add to model 
attr_accessible :yourfieldname_list 
acts_as_taggable_on :yourfieldname 

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