1

데이터를 레일 서버로 내보내는 안드로이드 응용 프로그램이 있습니다. Rails 3을 사용하면 모든 것이 잘 작동합니다. 그러나 레일 4의 서버는 다음과 같은 매개 변수 내용 대신 나타납니다레일 4는 HTTP 게시물 내용을받지 못하지만 레일스 3에서 작동했습니다.

내용은 다음에서 보낸
{"action"=>"export", "controller"=>"trainings"} 

: 레일에 의해

HttpPost httpPost = new HttpPost(link); 
String xmlFile = createXml(locationList); 
StringEntity entity = new StringEntity(xmlFile, "UTF-8"); 
httpPost.setEntity(entity); 
httpPost.addHeader("Content-Type", "application/xml"); 
httpClient.execute(httpPost); 

그리고 받았습니다를 다음 코드로 :

begin 
    if !params[:training].nil? && !params[:training][:location].nil? && !params[:training][:datetime].nil? 
    locations = params[:training][:location] 

    if locations.count > 0 
     training = Training.create! created_at: Time.at((params[:training][:datetime].to_i/1000)) 

     locations.each do |xml_location| 
     if !xml_location["latitude"].nil? && !xml_location["longitude"].nil? 
      Location.create! latitude: xml_location["latitude"], longitude: xml_location["longitude"], training_id: training.id 
     end 
     end 
    end 
    end 
rescue TimeoutError => e 

end 

몸체의 예는 다음과 같습니다.

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> 
<training> 
    <datetime>1409332572032</datetime> 
    <location> 
    <longitude>-122.084095</longitude> 
    <latitude>37.422005</latitude> 
    </location> 
    <location> 
    <longitude>-122.084095</longitude> 
    <latitude>47.422005000000006</latitude> 
    </location> 
    <location> 
    <longitude>-132.08409333333333</longitude> 
    <latitude>47.422005000000006</latitude> 
    </location> 
    <location> 
    <longitude>-142.08409333333333</longitude> 
    <latitude>47.422005000000006</latitude> 
    </location> 
</training> 

레일스 3에서 4 로의 변경 사항을 검색했지만이 동작이 변경 될 수있는 항목을 찾을 수 없습니다.

답변

1

params를 안전하게 처리하는 방법에 대한 주요 차이점은 rails3과 rails4입니다. 이는 strong_parameters입니다. Rails4에서는 허용되지 않는 매개 변수 [: training]에 직접 액세스하려고합니다. 여기에 가능한 해결책이 있습니다.

는 컨트롤러에 training_params 기능을 추가 (TrainingController?) :

private: 
    def training_params 
    params.require(:training).permit(:location, :datetime) 
    end 

다음 대신 PARAMS의 training_params를 사용합니다. 예 : training_params[:location]

strong_parameters에 대한 자세한 내용은 https://github.com/rails/strong_parameters을 참조하십시오. 솔루션은 단지 다음과 같은 오류가 발생합니다 적용하려고

+0

는 : 는 는 HTML 400 완료로 TrainingsController # 수출에 의해 2014년 8월 30일 14시 17분 32초 0200 처리에서 127.0.0.1에 대한 "/ 내보내기"를 POST 시작 잘못된 요청 0ms ActionController :: ParameterMissing (param이 누락되었거나 값이 비어 있습니다 : training) : app/controllers/trainings_controller.rb : 57 : training_params에 있습니다 app/controllers/trainings_controller.rb : 21 : in 'export ' – flp

+0

POST 데이터가 어떤 모습인지 알 수 있습니까? 당신은 "훈련"매개 변수를 게시하지 않는 것 같습니다? – mask8

+0

레일즈 3에서는 문제없이 작동하기 때문에 레일스가 http 포스트의 데이터를 삭제하는 것처럼 보입니다. 게시물 데이터는 { "action"=> "export", "controller"=> "trainingings"}이며 training_params가 params.permit 인 training_params.inspect로 가져 왔습니다. – flp

관련 문제