2

J'essaie d'utiliser acts_as_taggable plugin pour inclure la fonctionnalité tag dans mon application ruby ​​on rails. J'ai joint le code. J'ai installé le plugin et exécute également les migrations. J'obtiens l'erreur suivante.acts_as_taggable méthode indéfinie 'each' erreur

undefined method `each' for "value of the parameter":String 

code

location.rb - emplacement de la table a le nom, les balises (ce qui est un champ supplémentaire que j'ai dans le tableau, je l'ai ajouté avant de connaître sur le plugin :), ville champs

class Location < ActiveRecord::Base 
    belongs_to :profile 
    acts_as_taggable 
end 

profile.rb

class Profile < ActiveRecord::Base 
    has_many :locations 
    acts_as_tagger 
end 

location_controller.rb

def create 
    @location = Location.new(params[:location]) 
    @location.tag_list = ["tags1","tags2"] 
    if @location.save 
    redirect_to(@location) 
    else 
    redirect_to(@profile) 
    end 
end 

application Trace

/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:320:in `replace' 
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/associations.rb:1331:in `block in collection_accessor_methods' 
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2906:in `block in assign_attributes' 
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `each' 
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `assign_attributes' 
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2775:in `attributes=' 
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/base.rb:2473:in `initialize' 
/Users/felix/rails_projects/sample_app/app/controllers/locations_controller.rb:92:in `new' 
/Users/felix/rails_projects/sample_app/app/controllers/locations_controller.rb:92:in `create' 

Merci

+0

Quand est-ce que vous obtenez l'erreur ci-dessus? Où l'erreur apparaît-elle? Y a-t-il une trace de pile avec l'erreur? –

+0

Je l'ai eu dans le code du contrôleur, j'ai mis à jour la question avec l'application trace – felix

+0

Pouvez-vous s'il vous plaît partager ce que vous avez fini par faire (quelle option de la réponse acceptée) pour résoudre le problème? Je vous remercie. –

Répondre

3

Utilisez-vous Ruby 1.9 par hasard? Le reste de cette réponse est préfacé sur un oui. Si oui, continuez à lire.

Vous avez peut-être trébuché sur un changement de comportement de la version 1.9. Les chaînes dans 1.9 ne supportent plus each (c'est-à-dire qu'elles ne sont pas Enumerable comme Ruby 1.8). Mais vous pouvez utiliser each_char qui est probablement ce qui était prévu.

Si ce n'est pas votre code exploser alors vous pouvez soit:

  • Retour à 1.8.x (Obvious)
  • Hack la classe String en ajoutant une méthode each (Messy peut-être dangereux
  • Fixez la gemme ou le plugin qui cause le problème.

Il y a un grand article sur tout cela here

0

Je devine que, puisque je ne suis pas sûr de ce que les valeurs de params sont (peut-être vous pouvez sortir un params.inspect pour les obtenir); Je pense que la valeur que vous avez passée à Location.new dans params [: location] est une chaîne et attendait un hachage de paires de valeurs clés.

Peut-être que vous vouliez dire: Location.new(:location => params[:location])

Ou: Location.new(params)

Ou peut-être Location.new(params[:location])est correct, mais ce n'est pas un hachage comme il devrait être (ce qui est généralement fait pour vous par les aides de formulaire dans votre code de vue).

0

J'ai eu un problème similaire avec acts_as_taggable se plaindre d'un non défini chaque méthode et le problème est que j'avais le domaine mal à mon avis _form.J'ai eu:

<%= f.text_field :tags %> 

au lieu de ce qu'il devrait être:

<%= f.text_field :tag_list %> 
0

Essayez de remplacer @location.tag_list = ["tags1","tags2"] avec

@location.tag_list = "tags1, tags2"

vous pouvez également ajouter des balises comme si

@location.tag_list.add("tag1, tag2", parse: true)

chèque this cast pour plus d'informations