【问题标题】:multiple actions with different params structure具有不同参数结构的多个动作
【发布时间】:2018-06-19 11:34:43
【问题描述】:

我有一个测试 api 应用程序,我正在使用它在控制器中执行不同的操作。但我无法正确实施。

此控制器没有模型。它只是将控制权委托给某些服务。我无法将发布数据发送到操作。

class SimplexController < ApplicationController
    def initiate_request
        response = SimplexServices.new.initiate_request simplex_params
        render json: response
    end


    def update_kyc
        response = SimplexServices.new.initiate_kyc update_kyc_params
        render json: response
    end

    private 
    def simplex_params
        params.permit!
    end

    def update_kyc_params
        params.permit!
    end
end

对于 initiate_request,我在正文中有一个发布数据,如下所示

{
  "account_details": {
    "logins": [
      {
        "id": "200",
        "ip": "192.117.97.229",
        "uaid": "c387c6q6sr27csbuftfvq9v652",
        "timestamp": "2017-06-18T11:20:25Z",
        "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
        "is_api_initiated": false,
        "http_accept_language": "en-US,en;q=0.8,he;q=0.6"
      }
    ],
    "is_2fa_enabled": false,
    "partner_end_user_id": "246915",
    "identity_kyc_details": {
      "last_name": "Durden",
      "first_name": "Tyler",
      "document_id": "AB7654321"
    },
    "last_kyc_verification_timestamp": "2015-12-31T16:03:47Z"
  },
  "personal_details": {
    "email": "tylerdurden@paperstsoap.com",
    "phone": "+12885550153",
    "gender": "m",
    "address": {
      "zip": "19808",
      "city": "Bradford",
      "country": "US",
      "state": "DE",
      "address_line_1": "537 Paper street"
    },
    "last_name": "Durden",
    "first_name": "Tyler",
    "middle_name": "",
    "date_of_birth_ts": "1972-02-22T12:00:00Z"
  },
  "transaction_details": {
    "last_20_txs": [],
    "current_balance": {
      "amount": 0,
      "currency": "usd"
    },
    "payment_details": {
      "order_id": "PRTNR135791",
      "payment_id": "E98986D8-03C0-D777-07CD-C56496E2F266",
      "fiat_total_amount": {
        "amount": 1433.25,
        "currency": "usd"
      },
      "payment_flow_type": "deposit",
      "destination_wallet": {
        "address": "16M8D1ZgkWjziw8BaJDT4w1uBF4whfG7mW",
        "currency": "btc"
      }
    }
  }
}

对于 update_kyc 以下是发布请求

{
  "documents": [
    {
      "document_type_id": "1",
      "document_number": "doc123"
    },
    {
      "document_type_id": "2",
      "document_number": "doc456"
    }
  ]
}

如何在我的控制器中允许这样做?

现在我允许使用以下代码进行所有操作。但允许一切都是不好的。

private 
def simplex_params
  params.permit!
end

我必须如何在控制器中实现这种情况??

谢谢, 阿吉特

【问题讨论】:

    标签: ruby-on-rails-4 postman rails-api


    【解决方案1】:

    首先关于许可证的使用,这取决于要求。如果相关数据不敏感,您可以跳过许可并让所有参数在批量更新中更新。当模型包含密码、角色等敏感数据时,Permit 主要用于保护应用程序免于大量分配。

    当json数据传递给Rails api时,可以在params上使用permit,只需选择key并根据需要向下hash即可。来自文档:

       params = ActionController::Parameters.new({
       person: {
       name: "Francesco",
       age:  22,
       role: "admin"
         }
       })
    
    permitted = params.require(:person).permit(:name, :age)
    permitted            # => <ActionController::Parameters {"name"=>"Francesco", "age"=>22} permitted: true>
    

    在您的情况下,解析 JSON 并删除不需要的键

    【讨论】:

    • 我需要在动作中消耗所有参数。担心的是 params 结构必须只允许上面提到的 json 结构。不允许额外的键和值。
    • 如果您的 json 结构需要修复并且 json 的来源可以是任何第三方,那么您需要在控制器中重新构建结构以完全控制发送的数据
    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    相关资源
    最近更新 更多