Ruby on Rails:作为gem上的标记,在模型中使用上下文

hel*_*llo 6 ruby ruby-on-rails acts-as-taggable-on ruby-on-rails-4

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

通过模型中定义的上下文,您可以使用多种新方法来管理和查看上下文中的标记.例如,使用:技能上下文将这些方法添加到模型中: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
Run Code Online (Sandbox Code Playgroud)

控制器:

def project_params
  params.require(:project).permit(
    :user_id, :tag_list)
end
Run Code Online (Sandbox Code Playgroud)

视图

<%= f.text_field :tag_list %> <!-- wrapped in a simple_form -->
Run Code Online (Sandbox Code Playgroud)

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

谢谢

奖金:

所以最终,如果我有多个我要标记的东西:

acts_as_taggable_on :item, :more_taggable_item
Run Code Online (Sandbox Code Playgroud)

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

params.require(:project).permit(
    :user_id, :tag_list, :more_taggable_item_list)
Run Code Online (Sandbox Code Playgroud)

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

<%= f.text_field :more_taggable_item_list %>
Run Code Online (Sandbox Code Playgroud)

小智 1

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

如果您使用acts_as_taggable_on :items相反的方式(请注意复数,如 @smallbutton.com 所说),则将动态定义以下方法:item_list, item_list=, items, item_counts

因此,就您而言,您不需要第一个acts_as_taggable. 仅使用acts_as_taggable_on :items, :more_taggable_items. 然后,您可以在控制器和视图中使用item_listand来代替。more_taggable_item_listtag_list


PS:供参考,看看gem中acts_as_taggable是如何定义的:

# This is an alias for calling <tt>acts_as_taggable_on :tags</tt>.
def acts_as_taggable
  acts_as_taggable_on :tags
end
Run Code Online (Sandbox Code Playgroud)

方法生成有点复杂,但基本上它会循环acts_as_taggable_on参数,并用它们定义方法:

# Loop over [:items, :more_taggable_items]
tag_types.map(&:to_s).each do |tags_type|
  tag_type = tags_type.to_s.singularize # 'item', 'more_taggable_item'
  # ...

  taggable_mixin.class_eval <<-RUBY, __FILE__, __LINE__ + 1
    # Define item_list, more_taggable_item_list
    def #{tag_type}_list
      tag_list_on('#{tags_type}')
    end

    # ...
  RUBY
end
Run Code Online (Sandbox Code Playgroud)