0

Rails API アプリケーションに要件があります。クライアントは多くの注文を持つことができ、各注文はクライアントに属します。

class Client < ApplicationRecord
    has_many :orders
end

私のorder.rbは

class Order < ApplicationRecord
  belongs_to :client, dependent: :destroy
  accepts_nested_attributes_for :client
  validates_presence_of :order_amount, :service_amount, :miners_amount
end

/place_orderを公開したルートがあり、クライアントと注文を作成します。

class OrderProcessingController < ApplicationController
    def place_order
        @order = Order.new(order_processing_params)
        if @order.save
            render json: @order
        else
            render json: @order.errors.full_messages
        end
    end

    private
    def order_processing_params
        params.require(:order).permit(:order_amount, :service_amount, :miners_amount, client_attributes: [:name, :email, :phone_number, :date])
    end
end

これまでのところ、すべて正常に動作しています。今私の要件は、クライアントがクライアントテーブルに既に存在することを確認する必要があることです。はいの場合、注文の client_id を追加し、新しい注文を作成します。毎回新しいクライアントと注文を作成したくありません。

どうすれば before_filter などで同じことを達成できますか。クライアントパラメーターからクライアントを取得し、クライアントが存在する場合は、着信パラメーターからパラメーターキーを削除します???

place_order の投稿データは次のとおりです。

{
     "order" : {
       "order_amount" : "10000",
        "service_amount" : "1000",
        "miners_amount" : "10000",
         "client_attributes": {
                "name": "Ajith",
                "email": "ajith@gmail.com",
                "phone_number": "12231321312",
                "date": "12/12/12"
            }
         }
  }

前もって感謝します、アジット

4

2 に答える 2

0

解決策を得るために以下のアプローチを試しました。これが問題にアプローチする正しい方法であるかどうかはよくわかりません

class OrderProcessingController < ApplicationController
    before_action :find_client, only: :place_order
    def place_order
        if @client.present?
            @order = @client.orders.build(order_processing_params) 
        else
            @order = Order.new(order_processing_params)

        end
        if @order.save
            render json: @order
        else
            render json: @order.errors.full_messages
        end
    end

    private
    def order_processing_params
        params.require(:order).permit(:order_amount, :service_amount, :miners_amount, client_attributes: [:name, :email, :phone_number, :date])
    end

    def find_client
        begin
            @client =  Client.find_by_email(params[:order][:client_attributes][:email])
        rescue
            nil
        end
    end
end

ありがとう、アジット

于 2018-06-01T08:18:39.570 に答える