2009-10-26 5 views
0

Je n'ai pas utilisé de rails depuis la version 1.2 ou plus et quelques éléments ont changé. J'ai un problème où j'essaie d'enregistrer un modèle vide pour obtenir des erreurs de validation sur les attributs en utilisant: validates_presence_of et à la place j'obtiens l'erreur 'impossible de convertir HashWithIndifferentAccess en String'. Je vais essayer de simplifier mon code pour obtenir le point à travers aussi laconiquement que possible ...Rails erreur avec la validation et plusieurs modèles, ne peut pas convertir HashWithIndifferentAccess en chaîne

mon modèle:

class Project < ActiveRecord::Base 

    validates_presence_of :title, :description 
    validates_uniqueness_of :title 

    has_one :address 

    accepts_nested_attributes_for :address, :allow_destroy => true 
end 

modèle enfant:

class Address < ActiveRecord::Base 
    validates_presence_of :title, :street 
    belongs_to :project 
end 
contrôleur

:

class ProjectsController < ApplicationController 
    def create 
     @project = Project.new(params[:project]) 
     if @project.save 
      flash[:notice] = @project.title + ' successfully created' 
      redirect_to projects_path 
     else 
      render :action => 'new' 
     end 
    end 
end 

voir:

<%= error_messages_for 'project' %> 
<% form_for @project do |f| %> 
<table width="100%" cellpadding="3" cellspacing="0"> 
    <tr> 
     <td class="adminlabel"> 
      <label for="Title">Title</label> 
     </td> 
     <td class="adminbody"> 
      <%= f.text_field :title %> 
     </td> 
    </tr> 
    ..... 
    <% f.fields_for :address do |address| %> 
    .... 

Ce code ajoute et des mises à jour très bien aussi longtemps que je remplir tous les champs obligatoires, si je laisse tout en blanc je reçois l'erreur mentionnée ci-dessus, pas la manière la plus gracieuse des utilisateurs alertant il y a un problème;)

Demande params:
{ "commit" => "Enregistrer",
"projet" => { "title" => "",
"notes" => "",
"description" => "",
"address_attributes" => {"city" => "",
"zip" => "",
"title" => "",
"pays" => "",
"suite" => "",
"rue" => "",
"état" => ""}},
"authenticity_token" => » iNPQZrf/oBv22vaI0toTGhknwx0aAU3BSvnIh6qgYQ8 = "}

J'ai cherché pendant des jours et je suis à bout de nerfs, si quelqu'un peut jeter un peu de lumière sur cela pour moi, je l'apprécierais grandement.

Merci d'avance!

Brendan

PS - la trace de la pile comme demandé:

.../app/controllers/projects_controller.rb:27:in `+' 
.../app/controllers/projects_controller.rb:27:in `create' 
../actionpack-2.3.4/lib/action_controller/base.rb:1331:in `send' 
../actionpack-2.3.4/lib/action_controller/base.rb:1331:in `perform_action_without_filters' 
../actionpack-2.3.4/lib/action_controller/filters.rb:617:in `call_filters' 
../actionpack-2.3.4/lib/action_controller/filters.rb:610:in `perform_action_without_benchmark' 
../actionpack-2.3.4/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
../activesupport-2.3.4/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
../activesupport-2.3.4/lib/active_support/core_ext/benchmark.rb:10:in `realtime' 
../activesupport-2.3.4/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
../actionpack-2.3.4/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
../actionpack-2.3.4/lib/action_controller/rescue.rb:160:in `perform_action_without_flash' 
../actionpack-2.3.4/lib/action_controller/flash.rb:146:in `perform_action' 
../actionpack-2.3.4/lib/action_controller/base.rb:532:in `send' 
../actionpack-2.3.4/lib/action_controller/base.rb:532:in `process_without_filters' 
../actionpack-2.3.4/lib/action_controller/filters.rb:606:in `process' 
../actionpack-2.3.4/lib/action_controller/base.rb:391:in `process' 
../actionpack-2.3.4/lib/action_controller/base.rb:386:in `call' 
../actionpack-2.3.4/lib/action_controller/routing/route_set.rb:437:in `call' 
../actionpack-2.3.4/lib/action_controller/dispatcher.rb:87:in `dispatch' 
../actionpack-2.3.4/lib/action_controller/dispatcher.rb:121:in `_call' 
../actionpack-2.3.4/lib/action_controller/dispatcher.rb:130:in `build_middleware_stack' 
../activerecord-2.3.4/lib/active_record/query_cache.rb:29:in `call' 
../activerecord-2.3.4/lib/active_record/query_cache.rb:29:in `call' 
../activerecord-2.3.4/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
..activerecord-2.3.4/lib/active_record/query_cache.rb:9:in `cache' 
../activerecord-2.3.4/lib/active_record/query_cache.rb:28:in `call' 
../activerecord-2.3.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:361:in `call' 
../rack-1.0.1/lib/rack/head.rb:9:in `call' 
../rack-1.0.1/lib/rack/methodoverride.rb:24:in `call' 
../actionpack-2.3.4/lib/action_controller/params_parser.rb:15:in `call' 
../actionpack-2.3.4/lib/action_controller/session/cookie_store.rb:93:in `call' 
../actionpack-2.3.4/lib/action_controller/failsafe.rb:26:in `call' 
../rack-1.0.1/lib/rack/lock.rb:11:in `call' 
../rack-1.0.1/lib/rack/lock.rb:11:in `synchronize' 
../rack-1.0.1/lib/rack/lock.rb:11:in `call' 
../actionpack-2.3.4/lib/action_controller/dispatcher.rb:114:in `call' 
../actionpack-2.3.4/lib/action_controller/reloader.rb:34:in `run' 
../actionpack-2.3.4/lib/action_controller/dispatcher.rb:108:in `call' 
../rails-2.3.4/lib/rails/rack/static.rb:31:in `call' 
../rack-1.0.1/lib/rack/urlmap.rb:46:in `call' 
../rack-1.0.1/lib/rack/urlmap.rb:40:in `each' 
../rack-1.0.1/lib/rack/urlmap.rb:40:in `call' 
../rails-2.3.4/lib/rails/rack/log_tailer.rb:17:in `call' 
../rack-1.0.1/lib/rack/content_length.rb:13:in `call' 
../rack-1.0.1/lib/rack/chunked.rb:15:in `call' 
../rack-1.0.1/lib/rack/handler/mongrel.rb:64:in `process' 
..... etc. 

Un peu long, désolé;)

+0

Tout semble correct. Pourriez-vous poster la trace de la pile de l'erreur? Cela devrait vous donner une idée de ce qui échoue exactement. – EmFi

+0

Merci d'avoir regardé cela, j'ai regardé dans la trace de la pile comme vous l'avez suggéré mais sans beaucoup de succès. Je l'ai ajouté au corps de ma question pour que tout le monde puisse le voir. –

Répondre

2

Essayez d'ajouter

@project.address.build 

à votre contrôleur. Vous devez instancier l'objet adresse.

+0

Le problème n'est pas d'instancier l'adresse, comme je l'ai mentionné ci-dessus le code fonctionne nager dans le meilleur des cas, il échoue seulement lorsque j'essaie de passer des chaînes vides pour les champs obligatoires. –

+0

Il semble que votre "+" provoque le problème lorsque le titre du projet est nul. Essayez de supprimer cela de votre message flash et juste une chaîne de base "Créé" pour l'instant. – bensie

+0

Le '+' dans le message flash n'est jamais touché car le modèle n'est jamais créé avec succès, @ project.save retournera false si jamais il a été aussi loin. Aussi je crois que le titre du projet est passé comme une chaîne vide, pas nul. –

2

La trace ne ment pas. Vous rencontrez des problèmes avec une ligne 27. Le code que vous avez posté n'a pas 37 lignes, mais en fonction de la trace, je suis prêt à parier que c'est cette ligne. Parce que personne d'autre n'a de '+'. S'il y avait un + implicite, son appelant aurait été listé dans la trace.

flash[:notice] = @project.title + ' successfully created' 

Il est étrange qu'il atteigne ce point en fonction de vos validations. validates_presence_of devrait ajouter des erreurs sur les attributs qui sont nuls, faux ou "".La validation échoue-t-elle comme prévu lors de l'exécution dans la console?

Voici une version conviviale de votre code qui pourrait être utilisée pour localiser votre problème. Vous devriez être capable de simplement le coller dans la console pour aider à localiser votre problème.

params = { 
    "project"=> { 
    "title"=>"", "notes"=>"","description"=>"", 
    "address_attributes"=>{ 
     "city"=>"", "zip"=>"","title"=>"","country"=>"", 
     "suite"=>"","street"=>"","state"=>"" 
    } 
    } 
flash = {} 

@project = Project.new(params[:project]) 
if @project.save 
    flash[:notice] = @project.title + ' successfully created' 
    puts "Saved. Flash: #{flash[:notice]}" 
else 
    puts "validations failed:" 
    puts @project.errors.full_messages.map{|m| "\t#{m}"}.join("\n") 
end 
+0

Oui, j'ai découvert que c'était en fait un énorme oubli de la mienne sur la ligne 27, essayant de '+' quelque chose qui n'existait tout simplement pas. Merci beaucoup pour votre réponse, je ne suis pas très habitué à déboguer des trucs de rails pour le moment. –

Questions connexes