2017-05-25 4 views
1

scheduleモデルへのRailsサーバーへのAPI POSTリクエストを作成しています。私のアプリでは、リクエストはapi/scheduleにされています。スケジュールhas_many労働者。私はworker_info内の情報を抽出し、(:名前と電話労働者が2つの属性を持つ)新しいワーカーオブジェクトを作成したいparamsから属性を抽出し、それをRails 5の別のモデルに保存する方法は?

Started POST "/api/schedules" for 127.0.0.1 at 2017-05-25 09:57:49 -0700 
Processing by SchedulesController#create as */* 
    Parameters: {"date"=>"2017-05-26T02:00:00.000Z", "user_id"=>1, "worker_info"=>{"name"=>"Hello", "phone"=>"123-456-7890"}, "sched 
ule"=>{"date"=>"2017-05-26T02:00:00.000Z", "user_id"=>1}} 
Completed 500 Internal Server Error in 21ms (ActiveRecord: 0.7ms) 

:そのポスト要求内では、パラメータがこの(レールからログをコピー)のようになります。このような何か:

//schedule controller 
    def create 
    @schedule = Schedule.new(schedule_params) 
    @worker = Worker.new(worker_params) #get the parameters 
    @worker.save #save the newly created worker object 
    if @schedule.save 
     render json: @schedule 
    else 
     render json: @schedule, status: :unprocessable_entity 
    end 
    end 

... 


    def schedule_params 
    params.require(:schedule).permit(:date, :user_id, :worker_info) 
    end 

    def worker_params 
    params.permit(:worker_info) 
    end 

リクエストメソッドが(リアクトから)次のようになります。

return fetch(`api/schedules`, { 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/json', 
    }, 
    body: JSON.stringify({ 
     date: date, 
     user_id: 1, 
     worker_info: {name: 'Hello', phone: '123-456-7890'} 
    }) 
    ... 

、現在のコードと、それは新しいスケジュールとnil名前を持つ労働者を作成し、nil電話。

はどのようにして与えられたパラメータでapi/schedulesへの要求を行うと、worker_infoを抽出namephoneをつかむと、Workerモデルにそれを保存するためのRailsのを持つことができますか?

私はRailsにはaccept_nested_attributes_forと呼ばれるものがあることを知っていますが、私は多くの問題を抱えていました。私は手動でやりたいと思っています。どのようにこれを手動で行うことができますか?このようなworker_paramsを更新使用して

答えて

1

試してみてください。

def worker_params 
    params.require(:worker_info).permit(:name, :phone) 
end 

worker_infoscheduleworker_infoscheduleのキーではない、つまり、同じレベルにあることに気づきます。だから、schedule_paramsからworker_infoを削除することができます:

def schedule_params 
    params.require(:schedule).permit(:date, :user_id) 
end 

読みやすい、これはあなたのパラメータを示す図である(かなり形式で)を使用します。

{ 
    "date"=>"2017-05-26T02:00:00.000Z", 
    "user_id"=>1, 
    "worker_info"=> { 
    "name"=>"Hello", 
    "phone"=>"123-456-7890" 
    }, 
    "schedule"=> { 
    "date"=>"2017-05-26T02:00:00.000Z", 
    "user_id"=>1 
    } 
} 
+0

@Iggyをあなたは_Strong Parameters_についての詳細を読むことができます[here](http://edgeguides.rubyonrails.org/action_controller_overview.html#strong-parameters)は、あなたに 'require'と' permit'のより良い理解を与えるでしょう。 「スケジュールがどのようにオブジェクトとして表示されるのか」についてはわかりませんでしたが、私はあなたのコードをもっと見る必要があります。 – Gerry

関連する問題