【问题标题】:Rails return json depends on webhook action to be in line with DRYRails 返回 json 取决于 webhook 操作是否符合 DRY
【发布时间】:2020-09-29 12:30:28
【问题描述】:

我有一个 webhook 接收器服务,在响应中我需要发送特定的 json。我想符合 DRY 政策,所以我不想在 22 个地方重复相同的代码。预期的 json 应如下所示:

  render json: {
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            "here is the text depends on action",
          ],
        },
      },
    ],
  }

示例 3 操作如下:

  def create
    action_name = params[:webhook][:queryResult][:intent][:displayName]

    case action_name
    when 'get-calendar'
      render json: {
        "fulfillmentMessages": [
          {
            "text": {
              "text": [
                "show user's calendar",
              ],
            },
          },
        ],
      }
    when 'get-room'
      render json: {
        "fulfillmentMessages": [
          {
            "text": {
              "text": [
                'show available meeting rooms',
              ],
            },
          },
        ],
      }
    when 'login'
      render json: {
        "fulfillmentMessages": [
          {
            "text": {
              "text": [
                'login user',
              ],
            },
          },
        ],
      }
    end
  end

就像我写的那样,我在这里有 21 个动作,唯一改变的是: “文本”: [ '文本取决于行动', ], 在json的情况下是否可以不重复相同的代码?

【问题讨论】:

    标签: ruby-on-rails json ruby


    【解决方案1】:

    我认为这里最好的解决方案是将这个 case 逻辑移动到散列:

    ACTIONS = {
      "get-room" => "show available meeting rooms",
      "get-calendar" => "show user's calendar",
    }
    
    def create
      action_name = params.dig(:webhook, :queryResult, :intent, :displayName)
    
      render json: prepare_response(action_name)
    end
    
    def prepare_response(action_name)
      {
        "fulfillmentMessages": [
          {
            "text": {
              "text": [
                ACTIONS[action_name],
              ],
            },
          },
        ],
      }
    end
    

    未来还可以添加“验证”(守卫)之类的内容

    def create
      action_name = params.dig(:webhook, :queryResult, :intent, :displayName)
    
      return 'what ever you want here' if action_name.blank?
      return 'here as well' if ACTIONS.keys.exclude?(action_name)
    
      ...
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2019-08-13
      相关资源
      最近更新 更多