2012-10-13 4 views
0

좋아,이 사람이 나를 미치게 만듭니다. 우선, 모든 것이 제 개발 환경에서 잘 작동합니다. 하지만 프로덕션 환경에서는 여러 브라우저에서 일관성이 없습니다. 때로는 효과가 있고 때로는 그렇지 않습니다. 레일즈 3.1과 jQuery 1.8.2를 사용하고 있습니다. 나는 jQuery 1.4.1을 사용하고 있었고 그때도 작동하지 않았다.레일 아약스 게시물이 일관되게 작동하지 않습니다.

사용자가 "저장"버튼을 클릭하고 클라이언트가 JSON 형식의 데이터를 여러 개의 새로운 "응답"항목을 만드는 데 사용하는 레일로 보내고 사용자를 컨트롤러 "표시"작업으로 리디렉션합니다. (사용자가 설문에 응답 한 다음 모든 사용자에 대한 결과를 확인합니다). 여기

내보기 (answer.html)에서 관련 코드입니다 ('. save_button')

$.ajaxSetup({ 
    'beforeSend': function(xhr) { 
     xhr.setRequestHeader("Accept", "text/javascript") 
    } 
}); 

$(document).ajaxSend(function(e, xhr, options) { 
    var token = $("meta[name='csrf-token']").attr("content"); 
    xhr.setRequestHeader("X-CSRF-Token", token); 
}); 

var plot; 
var dataseries = [[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]],[[null,null]]]; 

$(document).ready(function(){ 
$('.save_button').click(function(event){ 
    event.preventDefault(); 
    var numItems = dataseries.length; 
    var item; 
    var sequence; 
    var question = <%[email protected]%>; 

    var dataArray = new Array(); 

    for (i=0;i<numItems;i++){ 
     var requestObj = { 
      question_id: "<%[email protected]%>", 
      user_id: "<%= @user %>",  
    } 
     item = $('.item_list li[data-seq='+i+']').attr('id'); 
     requestObj["item_id"] = item; 
     requestObj["x"]= dataseries[i][0][0]; 
     requestObj["y"]= dataseries[i][0][1]; 

    if (requestObj["item_id"]>0 && requestObj["x"]!=null && requestObj["y"]!=null){ 
     dataArray.push(requestObj); 
    } 


    } 
    var dataString = JSON.stringify(dataArray); 
    var a = $.ajax({ 
    url: "/responses/batchCreate", 
    data: dataString, 
    type: "POST", 
    dataType: 'json', 
    success: function(data, textStatus, jqXHR) { 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     alert('error:'); 
    }, 
    headers: { 
     'X-CSRF-Token': '<%= form_authenticity_token.to_s %>' 
    } 
    }) 


    window.location.replace("<%=question_path(@question)%>"); 
}); 

$ (함수 (이벤트)마다 화재 "오류"콜백 불을 클릭합니다.. ! -마다 너무 시간,하지만 때로는 여기에

이 관련 컨트롤러 코드 작동 : 때때로 데이터가 새로운 응답이 내 DB에서 생성되어 저장됩니다

def batchCreate 
     logger.info "RECEIVED AJAX DATA!!!!" 
     responses = ActiveSupport::JSON.decode(request.body.read) 
     responses.each do |resp| 
      if (resp["item_id"]!=:null && resp["x"]!=:null && resp["y"]!=:null) 
      @response = Response.new() 
      if resp["user_id"]!="" 
       @response.user_id=resp["user_id"]; 
      else 
       u = User.where(:token => cookies[:user]).first 
       if u.nil? 
       u = User.create!(:email => "guest_#{Time.now.to_i}#{rand(99)}@example.com", :password => cookies[:user], :token => cookies[:user]) 
       @response.user_id=u.id 
       else 
       @response.user_id = u.id 
       end 
      end 

      @response.question_id=resp["question_id"].to_i 
      @response.item_id = resp["item_id"].to_i 
      @response.x = resp["x"].to_i 
      @response.y = resp["y"].to_i 
      @response.save 
      end 
     end 

    respond_to do |format| 

     format.html { redirect_to @response, :notice => 'Question was successfully created.' } 
     format.json { render :json => response, :status => :created, :location => @response } 
     format.js 

    end 

    end 

하고, 페이지는 show 액션로 리디렉션 . 다른 때에는 페이지를 다시로드하기 만하면됩니다. 이 경우 게시 데이터가 서버에 도달하지 못하는 것 같습니다. production.log에는 아무 것도 없습니다.

저는 Ajax에 대한 완전한 초보자이며 Rails에서 좀 더 유능한 사람입니다. 이 문제를 해결하기 시작하는 방법에 대해서도 귀하가 제공 할 수있는 통찰력은 대단히 감사하겠습니다. 고맙습니다.

답변

0

모든 클릭에 페이지를 다시로드됩니다 클릭 핸들러의 끝이 선 :

이 때문에
window.location.replace("<%=question_path(@question)%>"); 

또는 실행의 타이밍에 따라 완료되지 않을 수있는 AJAX 요청을 리디렉션합니다. 나는 이것이 당신의 모순 된 결과의 원인이라고 생각합니다. 아마도 개발 환경의 실행 시간은 로컬에서 문제가 발생하지 않는 시간 일 수 있습니다.

나는 리디렉션이 AJAX 요청이 성공하는 경우에만 발생 있도록 성공 응답 핸들러 내부 코드 줄을 이동할 수 있습니다 생각

success: function(data, textStatus, jqXHR) { 
    window.location.replace("<%=question_path(@question)%>"); 
} 

나는 것 자바 스크립트를 생성하는 내장 된 루비 코드를 사용하지 마십시오 모든 JavaScript 코드를 뷰에서 애셋 파일로 옮깁니다. <%=question_path(@question)%> 인라인을 사용하는 대신 저장 버튼의 href 속성으로 원하는 URL을 설정하십시오.

# View 
<%= link_to "Save", question_path(@question), :class => "save_button" %> 

# JavaScript 
... 
success: function(data, textStatus, jqXHR) { 
    window.location.replace(e.target.href); 
} 
... 

또는 데이터 속성을 사용하여 href 속성 대신 URL을 저장할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 불행히도 여전히 작동하지 않습니다. 그리고 그런데 왜 자바 스크립트에 Ruby를 포함시키는 것이 좋은 생각이 아닌가? – MikeC

+0

자바 스크립트에 Ruby 코드를 임베딩하면 커플 링이 생성되고 도메인 논리가 정적 인 캐시 가능 파일이 될 수 있으며, 솔루션의 범위도 제한됩니다. 예를 들어 사용한 코드 부분에서 루비가 임베디드되어 있으면 솔루션이 매우 구체적이며 (항상 질문 경로로 리디렉션되는 반면), 내 제안은 특정 URL과 결합되지 않습니다. 어떤 값의 href 속성을 가진 모든 타겟을 처리 할 수 ​​있습니다. 지금 당면한 특정 문제에 대해서는 중요하지 않을 수도 있지만 결코 알 수 없습니다. –

+0

지금까지 문제가있는 한, 내가 보여준 정보로 더 이상 진단 할 수 있는지 확실하지 않습니다. AJAX 요청 + 리로드는 확실히 문제 였지만 분명히 문제를 일으키는 문제는 아닙니다. –

0

OK, 실제로 그 window.location.replace ("< % = question_path (@question) %>")는 부분적으로 범인이었습니다. 내가 이전에 대답했을 때 나는 그것을 옮겼다 고 생각했지만 분명히, 나는하지 않았다. 그것만으로는 충분하지 않았습니다. 내 작업을위한 템플릿 파일 인 batchCreate.js.erb도 누락되었습니다. 그것은 500 오류를 일으키는 것이고 그것은 ajax 호출에 오류 조건을 만든 것입니다. 지금 일하고있는 것 같습니다. 도와 주셔서 대단히 감사합니다 오그의 마법사!

+0

다행 이군! –

관련 문제