Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails中使用json数据在respond_上运行方法?_Ruby On Rails_Json - Fatal编程技术网

Ruby on rails 如何在Rails中使用json数据在respond_上运行方法?

Ruby on rails 如何在Rails中使用json数据在respond_上运行方法?,ruby-on-rails,json,Ruby On Rails,Json,我有一个模型,它返回一些参数,并包括来自其他模型的参数,如下所示: def as_json(options = {}) camelize_keys(super(options.merge(:only => [:id, :userId], include:{ comments: { only: [:test, :id] }, valediction: { only: [:name, :text, :hidden, :order] } }))) end def ca

我有一个模型,它返回一些参数,并包括来自其他模型的参数,如下所示:

def as_json(options = {})
  camelize_keys(super(options.merge(:only => [:id, :userId], include:{ 
    comments: { only: [:test, :id] },
    valediction: { only: [:name, :text, :hidden, :order] }
  })))
end

def camelize_keys(hash)
  values = hash.map do |key, value|
    [key.camelize(:lower), value]
  end
  Hash[values]
end
现在我已经将代码移动到我的控制器,因为不同的控制器操作需要返回模型的不同部分。索引应该只返回告别词,而show应该返回评论和告别词

新控制器:

  def index
    respond_with(displayed_user.microposts.all, include: {
      valediction: { only: [:name, :text] }
    })
  end

  def show
    respond_with(displayed_user.microposts.find(params[:id]), include: {
      comments: { only: [:test, :id] },
      valediction: { only: [:name, :text, :hidden, :order] }
    })
  end

但是我对rails非常陌生,我不知道如何将camelize_keys函数放入其中以使其工作。

您可以将该方法移动到模型中的类方法,例如

#class methods
class << self
  def camelize_keys(hash)
    values = hash.map do |key, value|
      [key.camelize(:lower), value]
    end
    Hash[values]
  end
end

在控制器/和/或模型中执行复杂的JSON格式通常会导致膨胀,这是一个很难测试的问题

一个很好的解决方案是使用AMS gem。它包含在Rails 5中,但通过将其添加到文件中,您可以轻松地将其添加到Rails 4项目中:

# See rubygems.org for latest verstion!
gem 'active_model_serializers', '~> 0.9.3' 
然后运行bundle安装并重新启动rails服务器

使用AMS,您可以创建序列化程序类,这些类定义了模型数据应如何用JSON、XML等表示。序列化程序基本上是一个类,它接受模型实例或模型数组,并在调用.serializable_hash时返回哈希或哈希数组

但是Rails会自动为您处理该部分

class MicropostSerializer < ActiveModel::Serializer
  attributes :id, :user_id
  has_many :comments
  has_many :valedictions
end

class CommentSerializer < ActiveModel::Serializer
  attributes :test, :id
end

class ValedictionSerializer < ActiveModel::Serializer
  attributes :name, :text, :hidden, :order
end
但是等等,卡米利兹的钥匙呢? 除非您必须支持一些需要camellized密钥的奇怪的遗留客户端,否则很少有理由这样做。大多数大型API都使用snakecase Facebook、Google等,Rails 5正朝着使用snakecase的JSONAPI规范发展

从您的代码示例来看,您的一些rails模型属性和支持它们的db列似乎都使用camelcase。您应该尽快通过迁移更改DB列

如果必须支持旧版数据库,则可以使用alias_属性:

class Pet < ActiveRecord::Base
  alias_attribute :ownerId, :owner_id
end

为什么在JSON输出中要使用骆驼化键?我知道javascript使用camelcase作为函数名,但是Rails API或任何其他提供camelcase属性名的API都很奇怪。非常感谢您提供的详细答案!我已经稍微更新了这个问题,因为我意识到我有点不清楚。。。我仍然不确定如何使用您的建议使microposts控制器索引操作仅返回microposts属性和告别,而不返回注释我仍然需要在microposts控制器显示操作中返回注释。render json:displayed_user.microposts.all,除了:[:comments]或者您可以创建不同的序列化程序并指定要使用的序列化程序:render json:displated_user.microscops.all,每个_序列化程序:microstopReviewSerializer如果在JSON表示中存在重大差异,则最好使用后者,以免控制器混乱。您说过在检索JSON时,我不需要对_键进行优化。所以我已经实现了这个,我的JSON现在有snake_case键,但是为了在JS中使用,你的意思是我应该在JS中编写一个函数来转换为camelCase吗?我不能在前端用蛇壳。
def index
  render json: displayed_user.microposts.all
end
class Pet < ActiveRecord::Base
  alias_attribute :ownerId, :owner_id
end