2015-10-04 63 views
0

我正在尝试构建一些具有特定属性值的嵌套对象。清单has_many订单,以及订单has_many order_events。构建期间设置的嵌套属性值未被保存

理想情况下,创建并保存新列表时,应该创建并保存相关订单(使用seller_id设置)和order_event(使用状态设置)。

我遇到了两个问题:

  1. 顺序保存,但seller_id不是。

  2. order_event根本没有保存。

在控制器中,我有:

def new                                        
    @listing = Listing.new 

    @order = @listing.orders.build(seller_id: current_user.id) 

    @order_event = @listing.orders.first.order_events.build(state: 'confirmed') 
end 

def create 
    @listing = Listing.new(listing_params) 

    respond_to do |format| 
     if @listing.save 
     format.html { redirect_to manage_path, notice: 'Listing was successfully created.' } 
     format.json { render :show, status: :created, location: @listing } 
     else  
     format.html { render :new } 
     format.json { render json: @listing.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

def listing_params 
    params.require(:listing).permit(:title, :address, :size, :min_lease, :price, :description, :state, space_ids: [], amenity_ids: [], images_files: [], images_attributes: [:id, :_destroy], orders_attributes: [:id, :_destroy, :start, :end, :seller_id, order_events_attributes: [:id, :_destroy, :state]]) 
end 

任何想法?

+0

您是否在视图中为订单和订单事件添加了字段到窗体?提交表单时,这些属性会在创建操作期间丢失并“重建”。 –

+0

不,我最初在表单中使用'hidden_​​fields'设置值,但是我从表单中删除了这些值,并将逻辑移至控制器。 –

+0

在这种情况下,您应该在保存列表之前将这两个分配移至您的创建操作。这样,它们包含在清单 –

回答

0

在您的创建操作中尝试分配seller_id@order_event像这样。

def new                                        
    @listing = Listing.new 

    @order = @listing.orders.build 
    @order_event = @order.order_events.build 
end 

def create 
    @listing = Listing.new(listing_params) 

    @order = @listing.orders.first 
    @order.seller_id = current_user.id 

    @order_event = @order.order_events.build(state: 'confirmed') 

    respond_to do |format| 
    if @listing.save 
     format.html { redirect_to manage_path, notice: 'Listing was successfully created.' } 
     format.json { render :show, status: :created, location: @listing } 
    else  
     format.html { render :new } 
     format.json { render json: @listing.errors, status: :unprocessable_entity } 
    end 
    end 
end 
+1

谢谢。它的工作原理,但我不得不添加'if @ order.present?',因为我有'accept_nested_attributes_for:orders,reject_if:lambda {| a |一[:开始] .blank? ||一个[:端] .blank? },allow_destroy:true'在我的模型中。总的来说,一切正常。 –

+0

可以赶上,我没有想到这一点。 –