2015-07-18 76 views
6

與環境中工作的我在想,如果有人能幫助我理解這部分的文檔中:Ruby on Rails的:作用於創業板加標籤,在模型

隨着模型定義的背景下,您有多個新方法在 處置來管理和查看上下文中的標籤。例如,通過 :技能情境,這些方法將被添加到模型:skill_list(和 skill_list.add,skill_list.remove skill_list =),skills(複數), 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?我試過這個,但它沒有產生和我現在一樣的結果......也許我在某個地方搞砸了,但是這個「理論上」是正確的嗎?

感謝

BONUS

所以最終,如果我有,我想標記多個件事:

acts_as_taggable_on :item, :more_taggable_item 

我可以在我的強烈PARAMS

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

然後我可以在我的vi中使用它ew:

<%= f.text_field :more_taggable_item_list %> 

回答

1

你是正確的。如果您在模型中使用默認acts_as_taggable(或明確acts_as_taggable_on :tags),下面的方法將被動態地界定創業板: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:作爲參考,看看如何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 
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 %> 
+0

您是否嘗試瞭解決方案? –