2017-04-11 74 views
0

我试图保存蒙戈::文献中嵌入另一个。我的课:NoMethodError(未定义的方法),用于嵌入对象

class Block 
    include Mongoid::Document  
    field :name, type: String 
    field :text, type: String 
    embeds_many :replies   
end 

其他类:

class Reply 
    include Mongoid::Document  
    field :content_type, type: String 
    field :title, type: String 
    field :payload, type: String 
    embedded_in :block 
end 

,创造方法控制器:

def create 
     @block = Block.where(:name => block_params[:name])   
     @quick_reply = Reply.new(title: params[:block][:quick_replies][:title], payload: params[:block][:quick_replies][:payload]) 
     @block.replies.push(@quick_reply)   
     @block.name = params[:block][:name] 
     @block.text = params[:block][:text]  
     if (@block.save) 
      respond_to do |format| 
       format.html {render :template => "block/text/edit"} 
      end    
     end   
    end 

我得到这个错误:

undefined method `replies' for #<Mongoid::Criteria:0x71cf550> 

我想了解为什么以及如何解决问题。谢谢。

回答

2
@block = Block.where(:name => block_params[:name]) 

.where不给你一个纪录 - 而不是它给你一个标准(有点像一个ActiveRecord::Relation),这是一个懒惰的加载对象,可在所有包含几个甚至没有记录。

相反,你需要使用.find_by选择的一条记录:

@block = Block.find_by(name: block_params[:name]) 

这也将提高一个Mongoid::Errors::DocumentNotFound如果块不能被发现 - 这是一件好事。如果找不到块试图创建一个嵌套的记录是毫无意义的。

还有一个更好的方法来创建嵌套的记录 - 通过使用accepts_nested_attributes_for。如果您想通过单个操作编辑文档及其子项,这也很有用。

但是,你可能首先寻求的是做出答复嵌套资源:

# config/routes.rb 
resources :blocks do 
    resources :replies, only: [:new, :create] 
end 

class RepliesController 

    before_action :set_block 

    # GET /blocks/:id/replies/new 
    def new 
    @reply = @block.replies.new 
    end 

    # POST /blocks/:id/replies 
    def create 
    @reply = @block.replies.new(reply_params) 
    if @reply.save 
     redirect_to @block, success: 'Thank you for your reply' 
    else 
     render :new, error: 'Your reply could not be saved' 
    end 
    end 

    private 
    def set_block 
    @block = Block.find(params[:id]) 
    end 

    def reply_params 
    params.require(:reply).permit(:title, :payload) 
    end 
end 

<%= form_for([@block, @reply || @block.replies.new]) do |f| %> 
    <div class="row"> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 
    </div> 
    <div class="row"> 
    <%= f.label :payload %> 
    <%= f.text_field :payload %> 
    </div> 
    <%= f.submit %> 
<% end %> 
相关问题