2016-04-03 77 views
0

嵌套的关联属性我有三个型号如下:Rails的:包括针对

#Product Model 
class Product < ActiveRecord::Base 
     belongs_to :user 
     has_one :address 
     validates :title, :description, :user_id, presence: true 
     validates :product_type, numericality:{:greater_than => 0, :less_than_or_equal_to => 2}, presence: true 
     accepts_nested_attributes_for :address 
    end 




    #Address Model 
    class Address < ActiveRecord::Base 
     belongs_to :city 
     belongs_to :product 

     def related_city 
      city = address.city 
     end 
    end 

#City Model 
class City < ActiveRecord::Base 
    has_many :addresses 
end 

我取一个产品,但我需要包括关联的属性以及在除了几个属性我JSON响应。 以下是我迄今所做的:

def show 
     product = Product.find(params[:id]) 
     render json: product.to_json(:include => { :address => { 
          :include => { :city => { 
              :only => :name } }, 
          },:user =>{:only=>{:first_name}}}), status: 200 
    end 

这是给我一个语法错误。如果我删除用户,它工作正常,但我也需要用户名称作为回应。此外,我将如何使用ruby的新哈希语法编写上述代码?

+0

使用新的语法通常会导致更少的内容出错。 ':include => {...}'变成'include:{...}'这样更容易阅读。使用旧风格的唯一原因是如果你仍然有理由使用可怕的1.8版本。 – tadman

回答

0

您可以使用此宝石解决这个问题:Active Model Serializers。它将允许您为每个模型创建序列化器,并根据需要使用它们来呈现格式化的JSON。看一看,让我知道。

0

问题是你的show方法的第五行有逗号包围着花括号。这里是哈希SANS逗号,在新的语法:

def show 
    product = Product.find(params[:id]) 
    render json: product.to_json(include: { address: { 
        include: { city: { 
            only: :name }}}}, 
        user: {only:{:first_name}}), status:200 
end 
+0

我试过上面的代码,但是我得到这个错误:“/home/paras/rails/lost_and_found/app/controllers/api/v1/products_controller.rb:31:语法错误,意外的'}',期待=>用户:{only:{:first_name}}}),status:200 ^“ – Paras

+0

哦,你可能需要从第6行移动到5的括号。我编辑了我的散列。 – trosborn

+0

没有运气。仍然收到以下错误:/home/paras/rails/lost_and_found/app/controllers/api/v1/products_controller.rb:31:语法错误,意外的'}',期待=>用户:{only:{:first_name}} ),状态:200^ #31 user:{only:{:first_name}}),status:200 – Paras