2017-03-31 1 views
0

Il existe un moyen de sérialiser un collection_check_boxes à partir d'une constante? Quelque chose comme ceci:Rails4: collection_check_boxes du tableau

# model 
class tutorial < ActiveRecord::Base 
    serialize :option 
    TYPES = ["Option 1", "Option 2", "Option 3"] 
end 

# view 
<%= form_for(@tutorial) do |b| %> 
    <%= f.collection_check_boxes(:option, Tutorial::TYPES, :id, :name) do |b| %> 
     <%= b.label class:"label-checkbox" do%> 
     <%=b.check_box + b.text%> 
     <%end%> 
    <% end %> 
<% end %> 

Ou tout simplement:

<%= f.collection_check_boxes :option, Tutorial::TYPES, :id, :name %> 

Quand j'essaie à la fois j'obtenir l'erreur:

undefined method `id' for "Option\t1":String 

Mes paramètres de permis sont déjà définis avec option: []

Quelqu'un a déjà fait quelque chose comme ça?

Merci!

Répondre

1

La définition est la suivante:

collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block)` 

Le premier est un procédé pour envoyer, la seconde est une collection, le troisième est une méthode qui est appelée pour définir une valeur d'option property, et le quatrième est un méthode appelée pour obtenir un texte et le placer comme étiquette pour une option.

<%= f.collection_check_boxes :option, Tutorial::TYPES, :id, :name %> 

Il vous utilisez Tutorial::TYPES (ce qui est un tableau si cordes) comme une collection, et appelez id et name méthodes sur chaque chaîne.

Votre collection doit être Tutorial.all, et d'obtenir une étiquette, vous devez mettre en œuvre une méthode sur un objet Tutorial pour que, par exemple:

enum type: [ 
    :type1, 
    :type2, 
    :type3, 
] 

Et l'utiliser comme ceci:

<%= f.collection_check_boxes :option, Tutorial.all, :id, :type %> 
+0

Mais en utilisant 'Tutorial.all', je fais une requête à partir du modèle. C'est exactement ce que je ne veux pas faire. Ce dont j'ai besoin, c'est l'appeler à partir du tableau, comme nous le faisons lorsque nous utilisons l'assistant 'select': <% = f.select (: lang, options_for_select (User :: LANGS, @ user.lang), {}, {}) %> –

+0

@FernandoAureliano ok, alors deux derniers éléments ne devraient pas être ': id' et': name' car ce sont des méthodes que vous appelez sur chaque élément de la collection, donc vous essayez d'appeler ': id' et': name' sur '" Option 1 ": String'. Vous pouvez changer 'TYPES' en hachage où les clés ou les valeurs sont des indices, et l'utiliser comme ça:' <% = f.collection_check_boxes: option, Tutorial :: TYPES,: clé,: valeur%> '. –

+0

Vous avez la même erreur 'clé de méthode non définie 'pour [1,' en utilisant un tableau comme: '[[1," option 1 "], [2," option 2 "], [3," option 3 "]]' –