如何在Rails中解析嵌套的JSON对象?

时间:2015-08-11 13:45:51

标签: ruby-on-rails ruby json asp.net-web-api

我将以下JSON发送到Rails 4.1.0

Started POST "/orders.json" for 127.0.0.1 at 2015-08-11 15:19:34 +0200
Processing by OrdersController#create as JSON
  Parameters: {"order"=>{"name"=>"Jon", "surname"=>"Do", "line_items_attributes"=>[{"work_id"=>16, "quantity"=>1, "total_price"=>34.5}, {"work_id"=>12, "quantity"=>2, "total_price"=>40}]}}
Unpermitted parameters: line_items_attributes

但是我得到了Unpermitted参数错误。我的订单型号:

class Order < ActiveRecord::Base
  belongs_to :user
  belongs_to :dispatch_method
  belongs_to :payment_method
  has_many :line_items, :dependent => :destroy
  accepts_nested_attributes_for :line_items 
end

我的orders_controller.rb

class OrdersController < ApplicationController
  before_action :set_order, only: [:show, :edit, :update, :destroy]
  def index
    @orders = Order.all
  end

  def show
  end

  def new
    @order = Order.new
  end

  def edit
  end

  def create
    @order = Order.create(order_params)

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

  def update
    respond_to do |format|
      if @order.update(order_params)
        format.html { redirect_to @order, notice: 'Order was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end

def destroy
    @order.destroy
    respond_to do |format|
      format.html { redirect_to orders_url }
      format.json { head :no_content }
    end
  end

  private
    def set_order
      @order = Order.find(params[:id])
    end
    def order_params
      params.require(:order).permit(:name, :surname, line_items_attributes: [:id, :work_id, :quantity, :total_price])
    end
end

我可以创建并保存新的订单实例,但不能创建line_item。

2 个答案:

答案 0 :(得分:0)

您可以尝试重新定义order_params,如下所示:

def order_params
  json_params = ActionController::Parameters.new(JSON.parse(params[:order]))
  return json_params.require(:name, :surname).permit(line_items_attributes: [:id, :work_id, :quantity, :total_price])
end

如您所见,我正在解析params[:order]以避免解析完整的params var。你可能需要在这里添加另一个json级别,但我希望你能得到这个想法。

答案 1 :(得分:0)

类似这样的事情

render :json => @booking, :include => [:paypal, 
                                       :boat_people,
                                       :boat => {:only => :name, :include => {:port => {:only => :name, :include => {:city => {:only => :name, :include => {:country => {:only => :name}}}}}, 
                                                :boat_model => {:only => :name, :include => {:boat_type => {:only => :name}}}}}]