Rails 4使用accepts_nested_attributes_for更新嵌套模型

时间:2014-10-10 00:33:26

标签: json ruby-on-rails-4

我试图获取基于Rails 4的api(不使用视图/表单)来接受json对象图并更新所有相关模型。我在主项目上没有任何运气,所以我创建了一个基本项目,试图让它工作,我不能让Rails允许嵌套模型的json数据中的元素被允许"允许& #34;参数。

我有三种型号:顶部,中部和底部。 Top有许多Middles,Middle有很多Bottous。 Everyting是在数据库中设置的,我有一个TopsController,我用它来接收PUT:

应用/控制器/ API / tops_controller.rb:

class Api::TopsController < ApplicationController

  respond_to :json

  def show
    all = Top.all
    render json: { result: "success", tops: all }
  end

  def update
    top = Top.find(params[:top][:id])
    top.update(top_params)
    render json: { result: "updated", top: top }
  end


  private

  def top_params
    params.require(:top).permit(:name, :middles_attributes => [:id, :name])
  end

end

应用/模型/ top.rb:

class Top < ActiveRecord::Base
  has_many :middles
  accepts_nested_attributes_for :middles, allow_destroy: true, reject_if: :all_blank

  def as_json(options = {})
    attrs = self.attributes
    attrs['middles'] = self.middles
    attrs
  end

end

应用/模型/ middle.rb:

class Middle < ActiveRecord::Base
  belongs_to :top
  has_many :bottoms
  accepts_nested_attributes_for :bottoms, allow_destroy: true, reject_if: :all_blank

  def as_json(options = {})
    attrs = self.attributes
    attrs['bottoms'] = self.bottoms
    attrs
  end
end

应用/模型/ bottom.rb:

class Bottom < ActiveRecord::Base
  belongs_to :middle
end

这是我在服务器上的update.json文件:

{
    "top":{
        "id":1,
        "name":"NewTopName",
        "middles":[
            {
                "id":1,
                "name":"UpdatedMiddleName",
                "top_id":1,
                "bottoms":[
                    {
                        "id":1,
                        "name":"UpdatedBottomName",
                        "middle_id":1
                    }
                ]
            }
        ]
    }
}

我使用:

curl -X PUT -H "Content-Type: application/json" --data @update.json  http://localhost:3000/top/edit

每次都更新Top.name属性,没问题,但忽略了Middle和Bottom数据。查看服务器输出,我看到了:

Started PUT "/top/edit" for 127.0.0.1 at 2014-10-09 17:09:24 -0700
Processing by Api::TopsController#update as JSON
  Parameters: {"top"=>{"id"=>1, "name"=>"NewTopName", "middles"=>[{"id"=>1, "name"=>"UpdatedMiddleName", "top_id"=>1, "bottoms"=>[{"id"=>1, "name"=>"UpdatedBottomName", "middle_id"=>1}]}]}}
  Top Load (0.2ms)  SELECT  "tops".* FROM "tops"  WHERE "tops"."id" = $1 LIMIT 1  [["id", 1]]
Unpermitted parameters: id, middles
...

Unpermitted parameters: id, middles部分似乎告诉我它不能(不会)在更新中处理这些middles参数,即使我已在TopsController中允许它们: :top_params方法使用:middles_attributes => [:id, :name](以及其他一些方法,包括... :middles => [])。

我在这里明显遗漏了一些东西,但我不能为我的生活看到它是什么。有什么建议?谢谢!

0 个答案:

没有答案