6

我想使用acts_as_taggable_on将两种不同“类型”的标签(部门类别和免费标签)分配给公司模型。注意:我是 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 gem)我有......

# 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

谁能暗示我如何才能做到这一点?

一个相关的问题是,这是否是一个好方法?仅使用类别模型通过联合模型分配扇区标签会更好吗?

谢谢!

4

2 回答 2

7

好吧,我解决了我的问题。结果很简单。唉,我最终通过一个联合“扇区化”表创建了一个单独的扇区模型。但如果有人感兴趣,我只想更新我在上述案例中所做的事情......

在我的公司模型中

# 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
于 2011-02-02T11:16:45.970 回答
1

似乎 act_as_taggable_on 使用单表继承,因此您实际上不需要创建任何额外的表。但是,您确实需要遵循他们的约定(他们从未声明过),如下所示:

//add to model
attr_accessible :yourfieldname_list
acts_as_taggable_on :yourfieldname

//view
<%= f.text_field :yourfieldname_list %>
于 2013-05-29T04:13:50.133 回答