Rails控制器修改JSON响应

时间:2016-02-17 20:15:26

标签: ruby-on-rails json

我的控制器中有这个方法:

# GET /bios/1
# GET /bios/1.json

def show
 if member_session?
   @member = MemberPresenter.new(@bio.member)
   # I need something here to add a flag to the json response to signal this is a member session.
 else
  @member = MemberPresenter.new(@bio.member)
 end
end

我需要修改json响应以返回类似的内容:

{member:@member,member_session:true}

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以将json参数用于render个函数:

render json: { member: @member, member_session: true }

但它不是在rails中呈现JSON的最佳方式。我建议您尝试使用https://github.com/rails-api/active_model_serializers

答案 1 :(得分:1)

我不确定您是否一直想要返回json,但这里也可以替代其他格式:

respond_to do |format|
  format.html
  format.json { render json: { member: @member, flag: @member.status } }
end

对于小而简单的对象,这样做很好,但如果你必须拖动关联,你可以选择使用序列化程序,或者你可以将to_json方法覆盖为这样的东西。 / p>

# member.rb

def as_json(options = {})
  options = options.merge(
    except: [
     :updated_at,
     :created_at,
    ],     
    include: {         # Getting associations here
      address: {
        only: [:street, :zip_code],
        include: {
          neighbors: { only: :name }
          }
        }
      }
   )
  super.as_json(options)
end

最后在控制器render json: @member.to_json内,它将拉出你想要的所有关联。这是懒人的序列化方式,即我所做的:)