Ruby on rails 检查更新操作rails 4中添加的新嵌套属性

Ruby on rails 检查更新操作rails 4中添加的新嵌套属性,ruby-on-rails,ruby-on-rails-4,nested-attributes,update-attributes,Ruby On Rails,Ruby On Rails 4,Nested Attributes,Update Attributes,我有一个嵌套表单,其中乘客卡和乘客卡分别是父卡和子卡 我可以根据自己的需要添加/删除乘客卡(部分支持railscast 197),该表运行良好 但当编辑操作时,我如何知道新卡已添加到编辑页面上 我的创建操作 @admin_passenger = Passenger.new(admin_passenger_params) i=0 respond_to do |format| if @admin_passenger.valid? params[:passenger][:passenger

我有一个嵌套表单,其中乘客卡和乘客卡分别是父卡和子卡

我可以根据自己的需要添加/删除乘客卡(部分支持railscast 197),该表运行良好

但当编辑操作时,我如何知道新卡已添加到编辑页面上

我的创建操作

 @admin_passenger = Passenger.new(admin_passenger_params)
i=0
respond_to do |format|
  if  @admin_passenger.valid?
  params[:passenger][:passenger_cards_attributes].values.each do |p|
    i += 1
    @admin_passenger.card_number = p[:card_number]
    @admin_passenger.card_expiry_month = p[:card_expiry_month]
    @admin_passenger.card_expiry_year = p[:card_expiry_year]
    @admin_passenger.card_cvc = p[:card_cvc]
    if i==1   
      @errors,@error_message = @admin_passenger.create_customer_payment_profile
    else
      @errors,@error_message = @admin_passenger.add_another_card   
    end
    if @errors == true
      flash.now[:alert] = @error_message
      format.html { render :new }
    else
      @admin_passenger.save
      @admin_passenger.get_paymentprofile(@admin_passenger.profile_id)
      passenger_card = @admin_passenger.passenger_cards.build(payment_profile_id: @admin_passenger.payment_profile_id, card_last_4: @admin_passenger.card_last_4, is_active: true, card_exp_month: @admin_passenger.card_expiry_month, card_exp_year: @admin_passenger.card_expiry_year, card_cvc: @admin_passenger.card_cvc)
      passenger_card.save
    end  
      format.html { redirect_to admin_passenger_path(@admin_passenger), notice: 'Passenger was successfully created.' }
      format.json { render :show, status: :created, location: @admin_passenger }
    end
  else
    #flash.now[:alert] = @admin_passenger.check_valid_card_details ?  @admin_passenger.errors.full_messages : @admin_passenger.errors.full_messages << "Invalid Card Details" 
    #@admin_passenger.errors.add(:card_number, "Invalid Card Details")
    format.html { render :new }
    format.json { render json: @admin_passenger.errors, status: :unprocessable_entity }
  end
end
我需要在添加卡上做一些处理,以便

def add_card
@admin_passenger = Passenger.find(params[:id])
if params[:passenger].present?
  @admin_passenger.card_number = params[:passenger][:card_number]
  @admin_passenger.card_expiry_year = params[:passenger][:card_expiry_year]
  @admin_passenger.card_expiry_month = params[:passenger][:card_expiry_month]
  @admin_passenger.card_cvc = params[:passenger][:card_cvc]
  puts("===================******")
  logger.warn("passenger==> #{@admin_passenger.card_number.inspect}===year #{@admin_passenger.card_expiry_year.inspect}===month #{@admin_passenger.card_expiry_month.inspect}")
  status = @admin_passenger.check_valid_card_details
  if !status
    flash.now[:alert] = "Invalid Card Details"       
  else
    @errors,@error_message = @admin_passenger.add_another_card
    if @errors == true
      flash.now[:alert] = @error_message
    else          
      redirect_to admin_passenger_path(@admin_passenger), notice: 'Passenger card was successfully added.' 
    end
  end
end
结束

我的问题是,是否有任何方法可以知道在编辑时添加了一张新卡 表单,以便调用add_card方法并进一步处理该卡


谢谢

实际上你不需要这样做,如果你的关系设置正确并且你的表单正常,你可以一次保存所有卡片。只要做:

@admin\u passenger=passenger.update(passenger\u参数)

然后将乘客参数定义为私有方法:

  private
   def passenger_params
     #complete the array below to contain all the required fields
     params.require(:passenger).permit(:id, :passenger_cards_attributes => [:card_number, :card_expiry])
   end

对于嵌套属性,您将获得以前添加的乘客卡的Id。请检查控制台日志中的嵌套属性参数

在乘客卡属性中=>{“0”=>{“id”=>“105”,“卡号”=>“123”},“1231232444”=>{“卡号”=>“456”}


在这里,卡号“123”的参数已经存在,因此它将与“id”一起传递,而对于您新创建的卡号“456”,则没有参数中的“id”。因此,对于那些没有ID的属性,只需调用“添加卡片”方法。

当有新的卡片参数可用时,我想调用添加卡片方法,然后只有我可以保存你应该在PassengerCard模型中的before_save或before_validation回调中这样做。那么多if/else语句和代码行通常是一个很好的指标,表明你需要以其他方式进行操作。你是对的,但你忽略了一点,那就是只有在编辑表单上添加新记录,然后我才能调用before保存回拨但新记录是新卡,对吗?因此,您可以在保存之前检查:为特定模型创建。你不应该在控制器里做那种事。
  private
   def passenger_params
     #complete the array below to contain all the required fields
     params.require(:passenger).permit(:id, :passenger_cards_attributes => [:card_number, :card_expiry])
   end