【问题标题】:How to use as_json in a controller to return a model's method display_name?如何在控制器中使用 as_json 来返回模型的方法 display_name?
【发布时间】:2017-07-20 15:32:51
【问题描述】:

在我的用户模型中,我有一个方法 display_name 来输出用户的全名。

user.rb (id, first_name, last_name, email, ...)
  def display_name
    [first_name, last_name].compact.join(' ')
  end

我正试图让我的控制器像这样返回 display_name:

  def show
    json_response({
      user: user.as_json(only: [:id, :display_name, :email])
    })
  end

问题是,控制器只发送 id 和电子邮件,而不是 display_name.. 我做错了什么?

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-5 activemodel


    【解决方案1】:

    根据docs

    要在模型上包含某些方法调用的结果,请使用 :methods:

    user.as_json(methods: :permalink)
    # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #      "created_at" => "2006/08/01", "awesome" => true,
    #      "permalink" => "1-konata-izumi" }
    

    还有:

    选项 include_root_in_json 控制 as_json 的顶级行为。如果为 true,as_json 将发出一个以对象类型命名的根节点。 include_root_in_json 选项的默认值为 false。

    user = User.find(1)
    user.as_json
    # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #     "created_at" => "2006/08/01", "awesome" => true}
    
    ActiveRecord::Base.include_root_in_json = true
    
    user.as_json
    # => { "user" => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #                  "created_at" => "2006/08/01", "awesome" => true } }
    

    也可以通过将 :root 选项设置为 true 来实现此行为,如下所示:

    user = User.find(1)
    user.as_json(root: true)
    # => { "user" => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #                  "created_at" => "2006/08/01", "awesome" => true } }
    

    所以,大概是这样的:

    user.as_json(only: [:id, :email], methods: :display_name, root: true)
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      user.as_json(only: [:id, :email], methods: [:display_name])
      

      user.as_json(only: [:id, :email]).merge({'display_name': user.display_name})
      

      或者有一个序列化器

      【讨论】:

        猜你喜欢
        • 2019-03-12
        • 2014-04-06
        • 1970-01-01
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多