2017-04-11 75 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 %> 
相關問題