2010-12-15 53 views
3

J'ai eu ce travail bien hier, fait quelques changements et je ne sais pas comment je l'ai cassé. Je suis sûr que c'est une faute de frappe quelque part, mais je ne peux pas le voir. Les modifications apportées au modèle imbriqué dans le formulaire ne sont tout simplement pas sauvegardées, le journal de développement montre les attributs en cours - et ils semblent être dans le bon format, mais ils ne sont pas du tout mis à jour.Attributs imbriqués ne pas enregistrer pour references_one dans Mongoid

J'ai un modèle User qui references_one Biography comme ceci:

# app/models/user.rb 
class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :first_name, :type => String 
    field :last_name, :type => String 
    devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable 

    references_one :biography 

    accepts_nested_attributes_for :biography 
    #--snip--- 
end 

# app/models/biography.rb 
class Biography 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :content, :type => String 
    field :role, :type => String 
    field :is_crew, :type => Boolean 

    referenced_in :user 
end 

Et enfin ma forme (j'utilise forme simple, mais pour la plupart il se comporte très semblable à formtastic):

<%= simple_form_for [:manage, @user], :html => {:multipart => true}, :position => :left do |f| %> 
    <h2>Login details</h2> 
    <%= f.input :email, :input_html => {:class => "text"} %>  
    <%= f.input :first_name, :input_html => {:class => "text"} %> 
    <%= f.input :last_name, :input_html => {:class => "text"} %> 

    <div class="biography"> 
    <h2>Biography</h2> 
    <%= f.simple_fields_for :biography do |biography_form| %> 
     <%= biography_form.input :role, :input_html => {:class => "text"} %> 
     <%= biography_form.input :content, :as => :text, :input_html => {:class => "textarea"} %> 
     <%= biography_form.input :is_crew, :as => :boolean %> 
    <%- end -%> 
    </div> 

    <%= f.submit "Save user", :class => "submit mid" %> 
<% end %> 

et une sortie de mon journal de développement, les réponses Incase gisent là, et je ne peux pas les voir:

Started POST "/manage/users/john-doe" for 127.0.0.1 at Wed Dec 15 11:42:09 +1100 2010 
     Processing by Manage::UsersController#update as HTML 
     Parameters: {"commit"=>"Save user", "authenticity_token"=>"44QlHsbKb8Pm91wnxWJa8Y0QsUXDzp/3rVpfs3G1Inc=", "utf8"=>"✓", "id"=>"john-doe", "user"=>{"biography_attributes"=>{"is_crew"=>"0", "role"=>"Tenor", "id"=>"4d080de56a4f1dfe7700000e", "content"=>"John was born on the 1st of January, 1970."}, "last_name"=>"Doe", "first_name"=>"Johnathan", "email"=>"[email protected]"}} 
    the_idea_of_north_development['users'].find({:_id=>BSON::ObjectId('4d06e6036a4f1dcb1b000001')}, {}).limit(-1) 
    the_idea_of_north_development['users'].find({:slug=>"john-doe"}, {}).limit(-1) 
    the_idea_of_north_development['biographies'].find({"user_id"=>BSON::ObjectId('4d080de06a4f1dfe7700000d')}, {}).limit(-1) 
    the_idea_of_north_development['$cmd'].find({"count"=>"users", "query"=>{:_id=>{"$ne"=>BSON::ObjectId('4d080de06a4f1dfe7700000d')}, :email=>/^[email protected]\.com\.au$/i}, "fields"=>nil}, {}).limit(-1) 
    the_idea_of_north_development['users'].find({"slug"=>"johnathan-doe"}, {}) 
    MONGODB the_idea_of_north_development['users'].update({"_id"=>BSON::ObjectId('4d080de06a4f1dfe7700000d')}, {"$set"=>{"slug"=>"johnathan-doe", "updated_at"=>Wed Dec 15 00:42:09 UTC 2010, "first_name"=>"Johnathan"}}) 
    Redirected to http://lvh.me:3000/manage/users 
    Completed 302 Found in 17ms 

Toute modification apportée à la mise à jour du modèle User est correcte, mais les modifications apportées au Biography ne sont pas enregistrées. Aide-moi ruche-esprit, tu es mon seul espoir!

Répondre

0

J'ai eu un problème similaire avec les modifications apportées aux documents imbriqués n'étant pas persisté. (La question est How Do I Update Nested Mongo Document Attributes in Rails with Mongoid?). Je me méfie de lui-même parce MongoId un message comme celui-ci est jamais connecté pour mettre à jour le document incorporé:

MONGODB the_idea_of_north_development['users'].update({"_id"=>BSON::ObjectId('4d080de06a4f1dfe7700000d')}, {"$set"=>{"slug"=>"johnathan-doe", "updated_at"=>Wed Dec 15 00:42:09 UTC 2010, "first_name"=>"Johnathan"}}) 

Si une tentative a été faite pour faire une mise à jour du document imbriqué, il y aurait un ligne semblable à celui en sélectionnant le document parent et la mise en valeurs du document imbriqué, tels que:

the_idea_of_north_development['users'].update({"_id"=>PARENT_DOCUMENT}, {"$set"=>{"biography_attributes.is_crew"=>"0", "biography_attribute.role"=>"Tenor", etc...}) 

Personnellement, je trouve Mongoid Issue #357 une raison possible.

+0

Il semblerait que le problème # 357 pourrait être résolu dans mongoid 2.0 rc 1 qui devrait arriver en janvier prochain. – wwilkins

+0

Merci pour le suivi. J'ai examiné la question un peu et je pense que vous avez probablement raison, vous serez sûr d'accepter cette réponse si le correctif arrange les choses. Le mec demeure. – theTRON

+0

Juste mis à jour à RC1, et ressemble à la question # 357 n'est toujours pas corrigé et qu'il introduit un tas de nouveaux problèmes avec les modèles référencés. Fini par devoir revenir à la beta-20. – theTRON

0

Tué deux semaines sur le même numéro. La seule correction que j'ai réussi à faire est la suivante. Dans le contrôleur de l'utilisateur, procédez comme suit:

if @user.save 
params[:user][:biography_attributes].each do |bio| 
     @biography = @user.biography.build({ :role => bio[:role], :iscrew => bio[:iscrew] }) 
    end 

Vous itérer sur toutes les instances de biographie et de l'enregistrer dans eplicitly DB.