2015-07-18 8 views
6

мне было интересно, если кто-то может мне помочь понять эту часть в документации:Рубин на Rails: Действует как taggable на камень, работая с контекстом в модели

С определенного контекста в модели, у вас есть несколько новых методы при утилита для управления и просмотра тегов в контексте. Например, с : контекст умения эти методы добавляются в модель: 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

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_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_list и more_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

Вы пробовали решение? –