Уменьшить сложность шаблона RABL

Мой шаблон RABL кажется очень не сухим и слишком сложным. Из-за этого я думаю, что я могу использовать это неправильно, или что есть лучшие способы генерирования желаемого результата.

Как вы можете видеть из кода show.rabl, я должен повернуть plugins_vulnerability.vulnerability связать в хэш JSON, явно выбрав, какие ключи мне нужны, затем объединить plugins_vulnerability.fixed_in значение в хеш, и, наконец, добавление нового хеша, который теперь содержит fixed_in значение, чтобы vulnerabilities_array массив.

Я делаю это, потому что я хочу fixed_in значение находиться в пределах vulnerability узел.

plugins_controller.rb

class Api::V1::PluginsController < Api::V1::BaseController
  def show
    @plugin = Plugin.friendly.includes(:plugins_vulnerability, :vulnerabilities).find(params[:id])
  end
end

show.rabl:

object @plugin
cache @plugin if Rails.env == 'production'

attributes :name

# Add the 'vulnerabilities' node.
node :vulnerabilities do |vulnerabilities|
  vulnerabilities_array = []

  # turn the plugins_vulnerability association into an array
  vulnerabilities.plugins_vulnerability.to_a.each do |plugins_vulnerability|
    vulnerability = plugins_vulnerability.vulnerability.as_json # turn the plugins_vulnerability.vulnerability association into json
    vulnerability = vulnerability.select {|k,v| %w(id title references osvdb cve secunia exploitdb created_at updated_at metasploit fixed_in).include?(k) } # only select needed keys

    vulnerabilities_array << { 
      :vulnerability => vulnerability.merge(:fixed_in => plugins_vulnerability.fixed_in)
    } # merge the fixed_in attribute into the vulnerability hash and add them to an array (fixed_in is from plugins_vulnerabilities)
  end

  vulnerabilities_array
end

output.json

{
  "plugin": {
    "name": "simple-share-buttons-adder",
    "vulnerabilities": [
      {
        "vulnerability": {
          "id": 88157,
          "title": "Simple Share Buttons Adder 4.4 - options-general.php Multiple Admin Actions CSRF",
          "references": "https:\/\/security.dxw.com\/advisories\/csrf-and-stored-xss-in-simple-share-buttons-adder\/,http:\/\/packetstormsecurity.com\/files\/127238\/",
          "osvdb": "108444",
          "cve": "2014-4717",
          "secunia": "",
          "exploitdb": "33896",
          "created_at": "2014-07-15T17:16:51.227Z",
          "updated_at": "2014-07-15T17:16:51.227Z",
          "metasploit": "",
          "fixed_in": "4.5"
        }
      },
      {
        "vulnerability": {
          "id": 88158,
          "title": "Simple Share Buttons Adder 4.4 - options-general.php ssba_share_text Parameter Stored XSS Weakness",
          "references": "https:\/\/security.dxw.com\/advisories\/csrf-and-stored-xss-in-simple-share-buttons-adder\/,http:\/\/packetstormsecurity.com\/files\/127238\/",
          "osvdb": "108445",
          "cve": "",
          "secunia": "",
          "exploitdb": "33896",
          "created_at": "2014-07-15T17:16:51.341Z",
          "updated_at": "2014-07-15T17:16:51.341Z",
          "metasploit": "",
          "fixed_in": "4.5"
        }
      }
    ]
  }
}

1 ответ

Решение

Я думаю, вы можете сделать что-то вроде этого:

object @plugin
cache @plugin if Rails.env == 'production'

attributes :name

child(@plugin.vulnerabilities => :vulnerabilities) {
  attributes :id, :title, :references, :osvdb, :cve, :secunia, :exploitdb, :created_at, :updated_at, :metasploit

  # Add the 'fixed_in' node.
  node :fixed_in do |vulnerability|
    @plugin.plugins_vulnerability.fixed_in
  end

}

Это должно создать тот же вывод, что вам нужно. И это не выглядит ужасно сложным для меня.

Другие вопросы по тегам