【问题标题】:Remove attribute from Json response从 Json 响应中删除属性
【发布时间】:2017-04-24 08:24:34
【问题描述】:

我有一个 REST 服务,其响应结构因请求的某些属性而异。从我的代码中,我根据要发送到控制器的响应返回不同的类对象(不是 ActiveRecord 对象)。从控制器获得的响应中,某些属性需要作为响应头传递。但这应该从响应正文中删除。如何从类对象中删除它?

假设我对控制器的响应可能是具有属性的 class1 对象:attr1、attr2、attr3

现在 attr3 实际上应该在响应标头中,所以这有效: response.headers["Headertitle"]=attr3

但我的 json 响应应该只有 attr1、attr2。

另一种情况可能是对控制器的响应是具有 attr1、attr3、attr4、attr5 的 class2 对象。从此 attr3 也转到响应标头。再次响应不应该有 attr3。

attr3 的值取决于某些业务规则,并根据要求而有所不同。但是每个响应都需要在响应标头中而不是在正文中具有 attr3。

如何从响应中删除 attr3?

我已经试过了:

format.json { 渲染 :json => json_response.to_json(除了: ["attr3"])}

这不起作用。

【问题讨论】:

  • 定义“不起作用”
  • 意思是attr3还在响应中。

标签: ruby-on-rails json rest response


【解决方案1】:

你可以使用Ruby Hash slice方法:

all = {name: "Zulh", email: "zulh@example.com", phone: "0123456789"}
=> {:name=>"Zulh", :email=>"zulh@example.com", :phone=>"0123456789"}

selected = all.slice(:name, :email)
=> {:name=>"Zulh", :email=>"zulh@example.com"}

selected.to_json
=> "{\"name\":\"Zulh\",\"email\":\"zulh@example.com\"}"

或者,如果您更喜欢except,以下是正确的做法:

all = {name: "Zulh", email: "zulh@example.com", phone: "0123456789"}
=> {:name=>"Zulh", :email=>"zulh@example.com", :phone=>"0123456789"}

selected = all.except(:phone)
=> {:name=>"Zulh", :email=>"zulh@example.com"}

selected.to_json
=> "{\"name\":\"Zulh\",\"email\":\"zulh@example.com\"}"

【讨论】:

    【解决方案2】:

    如果您使用的是 Rails 5。

    您可以执行以下操作:

        def send_auth_token_for_valid_login_of(user)
          render json: { user: user }, :except =>  [:password_digest, :token_created_at, :reset_password_token, :reset_password_sent_at]
        end
    

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多