从 API json 中删除 password_digest?

Removing password_digest from API json?

我正在使用 Sinatra 制作一个简单的小程序 API。我一直无法找到一种方法来从我正在输出的 JSON 中删除 'password_digest' 字段。好吧,我知道我可以做很多事情,但我觉得有一种更简单的方法。

get "/users/all" do
content_type :json
@users = User.all

response = @users.map do |user|
  user = user.to_h  
  user.delete("password_digest")
  user
end
response.to_json

结束

我要做的就是从输出中删除 password_digest 字段。有没有简单的方法可以做到这一点?我试过搜索但没有成功。

你应该可以做到这一点:

  get "/users/all" do
    content_type :json
    @users = User.all

    response = @users.map do |user|
      user = user.to_h  # If your data is already a hash, you don't need this line.
      user.delete(:password_digest) # <-- If your keys are symbolized
      user.delete("password_digest") # <-- If your keys are strings
      user
    end
    response.to_json
  end
get "/users/all" do
  content_type :json
  @users = User.all
  @users.to_json(except: [:password_digest])
end

您还可以覆盖模型上的 #as_json 以从序列化中完全删除属性:

class User < ActiveRecord::Base
  def as_json(**options)
    # this coerces the option into an array and merges the passed
    # values with defaults
    excluding = [options[:exclude]].flatten
                                   .compact
                                   .union([:password_digest])
    super(options.merge(exclude: excluding))
  end
end