通过从强参数传递关系id来创建模型

时间:2014-09-23 18:40:06

标签: ruby-on-rails ruby ruby-on-rails-4

我正在使用Rails构建API 4.有与之相关的组织和用户模型。 (下同)

现在,我想从这样的参数中创建新用户。

POST / users参数:

{
  "name": "Rails",
  "org_id": 1 // existing Org.id, Org.name == 'Ruby'
}

并且响应应该是这样的:

{
  "name": "Rails",
  "org": {
    "name": "Ruby"
  }
}

我想将org_id传递给User.create,以便将新用户与现有组织相关联。如何有效地使用强参数?


CODES

模型/ org.rb

class Org < ActiveRecord::Base
  has_many :users
end

模型/ user.rb

class User < ActiveRecord::Base
  belongs_to :org
  validates :org_id, presence: true
  validates :name, presence: true
end

控制器/ users_controller.rb

class API::UsersController < API::ApplicationController
  def create
    @user = User.create! create_params # can I do this?
  end

  private

  def create_params
    params.permit(:name, :org_id)
  end
end

1 个答案:

答案 0 :(得分:2)

更改 app / models / user.rb

class User < ActiveRecord::Base
  belongs_to :org
  validates :org_id, presence: true
  validates :name, presence: true
  accepts_nested_attributes_for :org
end

现在,你的参数应该是:

params = { "name" => "User name here!", "org_attributes" => { "id"=> "1", "name" => "Ruby" } }

此处,在id中传递org_attributes会更新user的现有记录,当您这样做时:

@user = User.create! user_params

在您的控制器中,方法user_params

  private

  def user_params
    params.permit(:name, org_attributes:[:id, :name])
  end

现在,@user = User.create! user_params只有在org参数内传递id时才应创建一个包含现有org_attributes的用户。