作为一个新手,我开始进行API POC。我有一种情况,如下所述:
我有seekerController,它具有create方法。我希望当Post请求发出请求时,很少有参数需要进入seeker表,而很少有需要进入profile表(该表还具有seekerID列)。我想在事务提交中做到这一点。因此,阅读后,我开始进行以下操作:-
ActiveRecord::Base.transaction do
seeker = Seeker.new(seeker_params)
seeker.save!
params[:seeker_id] = seeker[:id]
seekerprofile = SeekerProfile.new(seekerprofile_params)
seekerprofile.save!
end
render json: {status: 'success', message: 'Request is processed successully', data:seeker},status: :created;
我的定义如下:(我怀疑以下方法是否正确)
def seeker_params
params.require(:seeker).permit(:username, :alias, :mobile_number, :country_code, :email_address, :description, :status)
end
def seekerprofile_params
params.require(:seeker_profile).permit(:seeker_id, :first_name, :middle_name, :last_name, :date_of_birth, :pincode, :building_name, :address, :email_address, :description, :status)
end
让我在这里提出我的问题: 我有如下的正文请求参数:
{
"username" : "TestName12",
"alias" : "TestAlia12",
#above should go to seeker table
"first_name":"xyz",
"Last_Name":"abc"
#above should go above Seekerprofile table. seekerprofile has seekerid also.
}
我的模特在下面:-
> class SeekerProfile < ApplicationRecord
>
> belongs_to :seeker end
我尝试了在起始代码中发布的内容,但是由于seekerprofile_params为空,因此出现了错误。所以我确定我的方法是错误的。
任何人都可以提供示例代码,该怎么做?我是Java家伙,所以对Ruby来说比较新鲜。
答案 0 :(得分:0)
使用给出的有限信息,似乎问题可能与seeker_id
的结果中seekerprofile_params
字段为空有关。基本上,我们在保存params[:seeker_id]
之后将params[:seeker_id] = seeker[:id]
设置为Seeker
。但是在创建用于创建SeekerProfile
的参数时,我们使用seekerprofile_params
在seeker_id
中查找params[:seeker_profile][:seeker_id]
,因为在允许params.require(:seeker_profile)
之前使用seeker_id
。由于SeekerProfile
未获得seeker_id
,因此可能无法保存,具体取决于模型的设置方式。
但是,如果您要同时创建Seeker
和SeekerProfile
两者,则可能要签出nested attributes in Rails。
在收到更多输入后进行编辑:
考虑到API合同不能更改且需要维护,可以使用以下方法来创建seeker
和seeker_profile
:
1)我们可以将模型Seeker
更改为接受SeekerProfile
的嵌套属性,如下所示:
# app/models/seeker.rb
has_many :seeker_profiles # As mentioned in the question comments
accepts_nested_attributes_for :seeker_profiles
2)然后可以如下更改控制器代码:
# app/controllers/seeker_controller.rb
def create
seeker = Seeker.new(creation_params)
seeker.save!
render json: {status: 'success', message: 'Request is processed successully', data:seeker},status: :created
end
private
def creation_params
params.permit(:username, :alias).merge(seeker_profiles_attributes: [seeker_profile_creation_params])
end
def seeker_profile_creation_params
params.permit(:first_name, :last_name)
end
这里发生的事情基本上是我们允许seeker
模型在创建期间接受seeker_profiles
的属性。这些模型使用seeker_profiles_attributes
属性编写器来接受这些属性。由于该关系是has_many
关系,因此seeker_profiles_attributes
接受一个对象数组,其中每个哈希对象代表一个要创建的seeker_profile
子级。
在上面的代码中,我假设只创建一个seeker_profile
。万一您的API发生更改并希望在创建过程中接受多个配置文件,我将由您自己决定,以确保在遇到问题时您可以返回注释。
还要注意的另一件事是,ActiveRecord::Base.transaction
块不是必需的,因为任何正在创建的对象的失败都会使整个事务回滚。