Ruby on Rails:在gem上使用taggable,在模型

时间:2015-07-18 21:54:11

标签: ruby-on-rails ruby ruby-on-rails-4 acts-as-taggable-on

我想知道是否有人可以帮助我理解文档中的这一部分:

  

使用模型中定义的上下文,您可以使用多个新方法   处理和查看上下文中的标记。例如,用   :技能上下文将这些方法添加到模型中:skill_list(和   skill_list.add,skill_list.remove skill_list =),技能(复数),   skill_counts。

我有这个:

模型

class Project < ActiveRecord::Base
  acts_as_taggable # Alias for acts_as_taggable_on :tags
  acts_as_taggable_on :item
end

控制器

def project_params
  params.require(:project).permit(
    :user_id, :tag_list)
end

查看

<%= f.text_field :tag_list %> <!-- wrapped in a simple_form -->

所以我的问题是......这是否意味着,如果我的模型中有:items,我可以将所有:tag_list替换为:item_list?从现在开始只使用item_list?我尝试了这个,但它没有产生与我现在相同的结果......也许我搞砸了某个地方,但这“理论上”是否正确?

由于

奖金

所以最终,如果我想要标记不止一件事:

acts_as_taggable_on :item, :more_taggable_item

我可以在我强大的参数中找到这个

params.require(:project).permit(
    :user_id, :tag_list, :more_taggable_item_list)

然后我可以在我看来使用它:

<%= f.text_field :more_taggable_item_list %>

2 个答案:

答案 0 :(得分:3)

我想你必须使用复数形式,就像在文档中一样。所以:items而不是:item:more_taggable_items而不是:more_taggable_item。在创建正确的命名对话时,Rails提供了许多用于宝石的功能,并且好的宝石可以利用它。

# model
class Project < ActiveRecord::Base
  acts_as_taggable_on :items, :more_taggable_items
end

# params
def project_params
  params.require(:project).permit(
    :user_id, :item_list, :more_taggable_item_list)
end

# view
<%= f.text_field :item_list %> 
<%= f.text_field :more_taggable_item_list %>

答案 1 :(得分:1)

你是对的。如果您在模型中使用默认的acts_as_taggable(或显式acts_as_taggable_on :tags),则gem将动态定义以下方法:tag_listtag_list=,{{1} },tags

如果您改为使用tag_counts(注意复数,如@ smallbutton.com所述),将动态定义以下方法:acts_as_taggable_on :itemsitem_listitem_list=items

因此,在您的情况下,您不需要第一个item_counts。仅使用acts_as_taggable。然后,您可以在控制器和视图中使用acts_as_taggable_on :items, :more_taggable_itemsitem_list,而不是more_taggable_item_list

PS:作为参考,请参阅gem中的acts_as_taggable is defined

tag_list

method generation有点复杂,但基本上它会遍历您的# This is an alias for calling <tt>acts_as_taggable_on :tags</tt>. def acts_as_taggable acts_as_taggable_on :tags end 参数,并用它们定义方法:

acts_as_taggable_on