3

Ich hatte das gestern gut funktioniert, einige Änderungen vorgenommen und ich habe keine Ahnung, wie ich es gebrochen habe. Ich bin mir sicher, dass es irgendwo ein Tippfehler ist, aber ich kann es nicht sehen.Verschachtelte Attribute, die nicht für references_one in Mongoid gespeichert werden

Alle am verschachtelten Modell im Formular vorgenommenen Änderungen werden überhaupt nicht gespeichert, das Entwicklungsprotokoll zeigt die durchlaufenden Attribute - und sie scheinen im richtigen Format zu sein, aber es wird überhaupt nicht aktualisiert.

Ich habe ein Modell, das UserBiography wie so references_one:

# 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 

Und schließlich meine Form (i hier einfache Form bin mit, aber zum größten Teil formtastic verhält es sich sehr ähnlich):

<%= 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 %> 

und einige Ausgabe von meiner Entwicklung log, incase die Antworten dort liegen, und ich kippe sie gerade sehen:

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 

Alle Änderungen am User Modell sind in Ordnung, aber Änderungen am Biography sind nicht gespeichert. Hilf mir, wach zu bleiben, du bist meine einzige Hoffnung!

Antwort

0

Ich hatte ein ähnliches Problem mit Änderungen an verschachtelten Dokumenten, die nicht beibehalten werden. (Die Frage ist How Do I Update Nested Mongo Document Attributes in Rails with Mongoid?). Ich bin misstrauisch Mongoid selbst, weil eine Meldung wie die folgende wird für die Aktualisierung des eingebetteten Dokuments nie protokolliert:

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"}}) 

Wenn ein Versuch wurde ein Update für das verschachtelte Dokument machen gemacht werden, es würde eine sein Zeile ähnlich, dass man das übergeordnete Dokument auswählen und auf das verschachtelte Dokument Werte wie Einstellung:

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

ich persönlich finde Mongoid Issue #357 ein möglicher Grund.

+0

Sieht aus wie Ausgabe # 357 in Mongoid 2.0 RC 1 gelöst werden könnte, die irgendwann im kommenden Januar erwartet wird. – wwilkins

+0

Danke für das Follow-up. Ich habe dieses Problem ein wenig untersucht und denke, dass Sie wahrscheinlich Recht haben. Wir werden diese Antwort sicher akzeptieren, wenn der Patch die Dinge regelt. Der Kerl bleibt. – theTRON

+0

Nur auf RC1 aktualisiert und sieht aus wie Problem # 357 ist immer noch nicht behoben und es bringt eine Reihe von neuen Problemen mit referenzierten Modellen. Schluss damit, dass ich zur Beta-20 zurückkehren muss. – theTRON

0

Getötet zwei Wochen zum gleichen Thema. Die einzige Lösung, die ich geschafft habe, ist wie folgt. Benutzer Controller, dies tun:

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

Sie werden alle Instanzen Biografie iterieren und eplicitly es in DB speichern.

Verwandte Themen