3

У меня был этот рабочий день вчера, внесли некоторые изменения, и я понятия не имею, как я сломал его. Я уверен, что это опечатка где-то, но я не вижу этого.Вложенные атрибуты не сохраняются для ссылок в Монгоиде

Любые изменения, внесенные в вложенную модель в форму, вообще не сохраняются, журнал разработки показывает пройденные атрибуты - и они выглядят в правильном формате, но это просто не обновляется вообще.

У меня есть User модель, которая references_one Biography как так:

# 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 

И, наконец, свою форму (я использую простую форму здесь, но по большей части она ведет себя очень похоже на 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 %> 

и некоторые из моего вывода журнала развития, упаковывают ответы лежат там, и я просто не могу их видеть:

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 

Любые изменения в обновлении модели User прекрасно, но изменения в Biography несохранены. Помоги мне уль-ум, ты моя единственная надежда!

ответ

0

У меня была аналогичная проблема с изменением вложенных документов, которые не сохраняются. (Вопрос How Do I Update Nested Mongo Document Attributes in Rails with Mongoid?). Я с подозрением отношусь к самому Mongoid, потому что сообщение, как следующий никогда не регистрируются для обновления встроенного документа:

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

Если попытка была того, чтобы сделать обновление для вложенного документа, не было бы линия похожа на том, что один выбор родительского документа и уставки вложенного документа, например:

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

Лично я считаю Mongoid Issue #357 возможной причиной.

+0

Похоже, проблема № 357 может быть решена в mongoid 2.0 rc 1, которая ожидается в этом январе. – wwilkins

+0

Спасибо за последующее наблюдение. Я немного изучил этот вопрос, и я думаю, что вы, вероятно, правы, обязательно примите этот ответ, если патч будет разбираться. Чувак пребывает. – theTRON

+0

Просто обновлено до RC1, и похоже, что проблема № 357 по-прежнему не исправлена ​​и что она представляет собой кучу новых проблем с ссылочными моделями. Закончился переход на бета-20. – theTRON

0

Убито две недели по тому же вопросу. Единственное исправление, которое мне удалось сделать, заключается в следующем. В контроллере пользователя, выполните следующие действия:

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

Вы перебрать все экземпляры биографии и eplicitly сохранить его в БД.