【问题标题】:Ruby on Rails: Acts as taggable on gem, working with context in modelRuby on Rails:在 gem 上充当可标记,在模型中使用上下文
【发布时间】:2015-07-18 21:54:11
【问题描述】:

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

使用模型中定义的上下文,您可以在 处置以管理和查看上下文中的标签。例如,与 :skill context 这些方法被添加到模型中:skill_list(and Skill_list.add, Skill_list.remove Skill_list=), Skills(复数), 技能计数。

我有这个:

型号

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 %>

【问题讨论】:

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


    【解决方案1】:

    我猜你必须使用复数形式,就像在文档中一样。所以:items 而不是:item:more_taggable_items 而不是:more_taggable_item。在创建正确的命名约定时,Rails 为 gems 提供了许多功能,并且好的 gems 会利用这些功能。

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

    【讨论】:

      【解决方案2】:

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

      如果你改用acts_as_taggable_on :items(注意复数,正如@smallbutton.com所说),以下方法将被动态定义:item_listitem_list=itemsitem_counts

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


      PS:供参考,看看gem中的acts_as_taggable is defined如何:

      # This is an alias for calling <tt>acts_as_taggable_on :tags</tt>.
      def acts_as_taggable
        acts_as_taggable_on :tags
      end
      

      method generation 稍微复杂一点,但基本上它会循环您的 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
      

      【讨论】:

        猜你喜欢
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 2016-11-08
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 2014-12-01
        相关资源
        最近更新 更多