JSON POST 요청을 레일즈 앱에 포맷하려면 어떻게 해야 합니까?
내 레일즈 앱에는 완벽하게 작동하는 플레이어 클래스가 있습니다.레일 제어판에서 문제 없이 플레이어를 만들고 삭제하고 업데이트할 수 있습니다.
JSON 리퀘스트에 의한 플레이어의 작성에 의해, 리모트측에서 플레이어에 참가할 수 있으면 좋겠다고 생각하고 있습니다.작성 방법 위에 있는 자동 생성된 Rails 코멘트의 조언에 따라 다음 절차를 수행합니다.# POST /players.json
다음 주소로 요청을 보내기 시작했습니다.localhost:3000/players.json
JSON
{
"player": {
"name": "test",
"room_id": 0,
"skin_id": 1,
"head_id": 2,
"torso_id": 3,
"legs_id": 4,
"x_position": 5,
"y_position": 6,
"direction": 7,
"action": "",
"gender": "f"
}
}
다만, 다음의 에러 메세지가 표시됩니다.
ActionController::ParameterMissing in PlayersController#create param not found: player
그래서 제 질문은 다음과 같습니다.보내는 JSON을 어떻게 구성하면 좋을까요?
추가 정보:
- 루비 버전: 2.0
- 레일 버전: 4.0
- 우편배달부를 사용하여 요청을 전송해 보았습니다.
업데이트 - 플레이어 파라미터
컨트롤러의 플레이어 파라미터 메서드는 다음과 같습니다(요청대로).
def player_params
params.require(:player).permit(:name, :room_id, :skin_id, :head_id, :torso_id, :legs_id, :x_position, :y_position, :direction, :action, :gender)
end
업데이트 2 - 플레이어 컨트롤러
class PlayersController < ApplicationController
before_action :set_player, only: [:show, :edit, :update, :destroy]
skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| c.request.format == 'application/json' }
# GET /players
# GET /players.json
def index
@players = Player.all
end
# GET /players/1
# GET /players/1.json
def show
end
# GET /players/new
def new
@player = Player.new
end
# GET /players/1/edit
def edit
@rooms = Room.all.map { |room| [room.name, room.id] }
end
# POST /players
# POST /players.json
def create
@player = Player.new(player_params)
respond_to do |format|
if @player.save
format.html { redirect_to @player, notice: 'Player was successfully created.' }
format.json { render action: 'show', status: :created, location: @player }
else
format.html { render action: 'new' }
format.json { render json: @player.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /players/1
# PATCH/PUT /players/1.json
def update
respond_to do |format|
if @player.update(player_params)
format.html { redirect_to @player, notice: 'Player was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @player.errors, status: :unprocessable_entity }
end
end
end
# DELETE /players/1
# DELETE /players/1.json
def destroy
@player.destroy
respond_to do |format|
format.html { redirect_to players_url }
format.json { head :no_content }
end
end
def manage_furni
@player = Player.find(params[:id])
@furni = Furni.all
end
def add_furni
player = Player.find(params[:id])
player.furnis << Furni.find(params[:furni])
redirect_to manage_furni_path(player)
end
def remove_furni
player = Player.find(params[:id])
item = InventoryItem.find(params[:item])
player.inventory_items.delete(item)
redirect_to manage_furni_path(player)
end
private
# Use callbacks to share common setup or constraints between actions.
def set_player
@player = Player.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def player_params
params.require(:player).permit(:name, :room_id, :skin_id, :head_id, :torso_id, :legs_id, :x_position, :y_position, :direction, :action, :gender)
end
end
업데이트 3: 로그
(
"Processing by PlayersController#create as JSON",
"Completed 400 Bad Request in 31ms",
"ActionController::ParameterMissing (param not found: player):",
"app/controllers/players_controller.rb:103:in `player_params'",
"app/controllers/players_controller.rb:40:in `create'",
"Rendered /Users/drewwyatt/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.5ms)",
"Rendered /Users/drewwyatt/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.9ms)",
"Rendered /Users/drewwyatt/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms)",
"Rendered /Users/drewwyatt/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (16.3ms)"
){
}
우선, 당신의 데이터 포맷은 문제없고 여기서 문제가 되지 않는다고 생각합니다.내가 정확히 같은 문제에 부딪혔을 때 그것은 내가 그것을 보내지 않았기 때문이다.Content-Type: application/json
헤더를 첨부합니다.
Postman에서 'raw' 데이터 형식을 선택한 다음 'JSON(애플리케이션/json)'을 선택하여 이 헤더를 포함할 수 있습니다.제 경우 다음과 같습니다.
또는 다음과 같이 시도해 볼 수도 있습니다.curl
(출처):
curl -X POST -H "Content-Type: application/json" -d '{"player": {"name": "test","room_id": 0,"skin_id": 1,"head_id": 2,"torso_id": 3,"legs_id": 4,"x_position": 5,"y_position": 6,"direction": 7,"action": "","gender": "f"}}' localhost:3000/players.json
를 생략하면-H "Content-Type: application/json"
를 포함하면 400 응답과 함께 "syslog not found" 오류가 나타납니다.
이것을 시험하는 경우는, 다음과 같이 하십시오.
via Postman - Form-data(폼 데이터) 탭에서 다음과 같은 값을 지정해야 합니다.
player[name]
player[room_id]
.
.
jQuery 경유:
$.ajax({ url: 'url', type: 'post', data: { player: { name: 'Test', room_id: '0' } } })
언급URL : https://stackoverflow.com/questions/18690196/how-should-i-format-a-json-post-request-to-my-rails-app
'programing' 카테고리의 다른 글
웹 팩을 사용하여 CDN 또는 외부 벤더 javascript lib를 html 파일이 아닌 js 파일로 로드하는 방법 (0) | 2023.03.21 |
---|---|
react와 함께 materialize-css를 사용하는 방법 (0) | 2023.03.21 |
다른 속성에서 정의된 디렉티브 속성 내의 콜백 함수 (0) | 2023.03.21 |
JSON 문자열을 만들 때 특수 문자를 피하는 방법 (0) | 2023.03.21 |
워드프레스:링크를 표시하기 전에 이전 게시물이 있는지 확인합니다. (0) | 2023.03.16 |