2014-09-08 1 views
2

컨트롤러에서 레일즈 애플리케이션의 자바 스크립트 파일로 데이터를 가져 오려고합니다. html은 select 옵션과 organization id를 매개 변수로 사용하여 즉시 ajax 요청을 호출합니다. before_filter에서 AJAX 요청이 레일즈 애플리케이션의 컨트롤러에서 인스턴스 변수를 가져올 수 없습니다.

나는

def set_org_id 
    if params[:id].present? 
     @org_id = klass.find(params[:id]).id 
    else 
     @org_id = 0 
    end 
end 

을 그리고 JS 파일에 내가 가진 :

$.ajax({ url: "/admin/analytics/filter", 
     type: 'GET', 
     data: { 
      time_frame: selectedId, 
      organization_id: <%= @org_id %> 
     } 
}) 

만약 내가 하드 코드 ORGANIZATION_ID 모든 것이 잘 작동하지만 같은 숫자 나는 통과 할 때 전에 필터에서 데이터, 나는 페이지에 아무 ID와 끝.

인덱스 경로가 admin/analytics/인 것을 추가해야합니다. 필터 조치는 admin/analytics/filter입니다. 사용자는 결코 해당 페이지로 이동하지 않으며 Ajax 만 필터 경로를 조회하여 관련 데이터를 가져옵니다. 인스턴스 변수가 설정되기 전에 ajax 요청이 전송되고있을 수 있습니까? 그렇다면 적절한 해결책은 무엇입니까?

답변

0

데이터를 html.erb 페이지의 숨겨진 필드에 전달하여이 문제를 해결할 수있었습니다.

<%= hidden_field_tag('org_id', @org_id) %> 

그런 다음 자바 스크립트에서 선택기를 통해 데이터를 참조하십시오.

organization_id: $('#org_id').val() 

나는 이것을 좋아하지 않지만 적어도 작동합니다.

3

컨트롤러에서 컨트롤러를 호출하지 않으면 JS에서 @instance variables에 액세스 할 수 없습니다. 여기서 문제는 ajax을로드하여 인스턴스 varialbe에 액세스하는 경우입니다. 단순히 작동하지 않습니다.

설명해 드리죠 ...


JS

Javascript클라이언트 측 언어로 알려져있다 - 그것은 당신의 HTML의 요소에 액세스 할 수있는 기능을 제공합니다 의미/DOM 상대적인 면제를 받았다. 문제는 여기에 레일/루비, 많은 PHP처럼, 결과적으로이 호출하는 것은 단순히 다음은 작동하지 않습니다 것을 의미 브라우저

렌더링 데이터를 제공 할 경우에만 할 수있다 서버 측, 그리고 것입니다 :

data: { 
    time_frame: selectedId, 
    organization_id: <%= @org_id %> 
} 

으로는 그 이유가 당신이 당신의 자바 스크립트에서 @org_id에 액세스 할 수 있다는 것입니다 설명했다.먼저 @org_id 변수를 설정할지 (Rails 헬퍼를 사용하려는 경우) 알지 못하며 두 번째로 JS가 변수이기 때문에 (레일이기 때문에) 어쨌든 (레일이기 때문에)

-

수정

이의 순수한 수정은 어떻게 든 당신이 DOM에 필요한 데이터를 생성하는 것입니다. 나는 당신이 당신의 폼에 숨겨진 필드를 설정했다는 것을 당신의 대답에서 봅니다.

$(document).on("submit", "form", function(){ 
    $.ajax({ 
     ... 
     data: { 
     time_frame: selectedId, 
     organization_id: $(this).data("org_id") 
     } 
    }); 
}); 
을 :

<%= form_tag route_path, data: { org_id: @org_id } %> 

이 당신에게 전화 할 수있는 기능을 제공합니다 : set an HTML5 "data" attribute, 또는id

를 사용하는에이 일을 훨씬 더 좋은 방법은 당신이 일을 더 나은 것입니다

관련 문제