2012-06-21 2 views
4

부분이라고 "형태"onchange를 표시/변경 부분 사용하여 드롭 다운이 있습니다

<%= render "form"%> 

나는 변화가있을 때마다 부분을 렌더링 할 필요가있다

<%= select("array", "folder", @rows.keys, {}, :onchange =>"?")%> 

선택 선택. 할 수있는 방법이 있으면 알려주세요. remote_function은 레일 3.0에서 더 이상 사용되지 않습니다. 나는 모든 가능한 링크를 onchange 및 select 태그와 함께 보았지만 적절한 답을 찾을 수 없었다. 레일, jQuery 및 Ajax를 처음 사용합니다. 왜 같은 페이지에서 폼을 렌더링하지

감사

답변

2

도움 숨기고 선택 태그

<html> 
    <body> 

    <!-- Your Select tag --> 
    <select id="select_id"> 
    <option value="one" selected> One </option> 
    <option value="two"> Two </option> 
    </select> 

    <!-- Here your a div inside with your form is placed --> 
    <div id="myform" style="display:none"> 
    <form action="/someurl"> 
     .. .. 
    </form> 

    <!-- JQuery code to show the form --> 
    <script type="text/javascript"> 
    $(document).ready(function() { 
     $("select#select_id").bind("change",function() { 
     if ($(this).val() == "one") 
      $("div#myform").show(); 
     else 
      $("div#myform").hide(); 
     }) 
    }) 

    </script> 

</html> 

의 나는 여전히 아약스 요청을 할 변화를 보여주십시오 나도 꽤 간단하다.

$(document).ready(function() { 
    $("select#select_id").bind("change",function() { 
    if ($(this).val() == "one") { 
    $.ajax({ 
     url : "/form_url", 
     data : "html", 
     type: "GET", 
     success : function(data) { 
      $("div#myform").html(data) 
     } 
    }) 

    }) 
}) 

당신은 respond_to 할 필요가있다. ajax 요청을 format.js을 사용하고 render 명령을 사용하여 템플릿을 렌더링하거나 .js.erb 파일을 정의하십시오.

+0

고맙습니다. 문제가 해결 된 것 같습니다. 자세한 내용이 필요하면 다시 돌아올 것입니다. – user1455116

11

분명히 할 수있는 방법이며, 약간의 작업이지만, 일단 멈추게되면 매우 쉽습니다. .

먼저 선택 상자의 change 이벤트에 jQuery 함수를 첨부해야합니다. 이것은 application.js 파일에 자바 스크립트를 추가하여 수행 할 수 있습니다. 우리는 javscript가 unobtrustive으로 유지되도록 여기에서이 작업을 수행하려고합니다. 당신은 당신의 application.js 파일에 이런 식으로 뭔가를 시도 할 수 있습니다 :이 무엇

$(document).ready(function(){ 
    $("#select_field_id").change(function(){ 
    var id = $(this).children(":selected").val(); 
    var params = 'some_id=' + id; 
    $.ajax({ 
     url: "/some_controller/change_folder", 
     data: params 
    }) 
}); 

는 ID select_field_id와 선택 필드의 change 이벤트에 익명 함수를 연결합니다. 해당 필드가 변경되면 선택한 옵션의 id이 var id에 저장되고 var params = 'some_id=' + id;으로 전송할 요청에 대한 매개 변수를 만듭니다. some_id은 변경하려는 ID의 ID가됩니다 (예 : folder_id).

이제 컨트롤러에서이 요청을 처리 할 메서드를 만들어야합니다. 그래서 폴더 예에 가고, 폴더 컨트롤러에이 추가

def change_folder 
    @folder = Folder.find(params[:some_id]) 
    respond_to do |format| 
    format.js 
    end 
end 

이 단순히 change_folder로 아약스의 요청에 의해 전송 된 ID를 기준으로 폴더를 찾습니다. 또한 렌더링 할 해당 change_folder.js.erb 또는 change_folder.js 파일을 찾습니다.

이제 change_folder.js.erb 파일을 작성해야합니다. 페이지 일부의 HTML을 새 폴더로 대체해야하므로 div 또는 고유 한 ID가있는 다른 섹션이 있어야합니다.

change_folder.js.erb 내부에서, 우리는 이것을 쓸 수 있습니다 :이 change_folder.js.erb 파일과 같은 디렉토리에 _folder.html.erb라는 부분을 렌더링

$('#your_div').html("<%= escape_javascript(render(partial: "folder", 
locals: { :folder => @folder })).html_safe %>") 

. 부분은 필드를 표시하기위한 @folder 변수를 사용해야합니다, 그래서 당신은 같은 필요 : 당신의 _folder.html.erb 부분 내부

<%= @folder.name %> 
<%= @folder.last_updated %> 

합니다. .name.last_updated은 물론 폴더 모델의 속성으로 구성되어 있습니다. 폴더 모델에 부여한 속성을 대신 사용해야합니다.

당신이 있어야 할 곳으로 가야합니다. 명확한 것이 필요한 경우 알려주십시오.

+0

iam이 완전히 Rails, Jquery, Ajax에 새로 추가되어서 정말 고맙습니다. js.erb 파일을 렌더링하고 부분적으로 렌더링합니다. 현재 @viren이 내 문제를 해결했습니다. – user1455116

+0

@ Zajn의 글을 작성해 주셔서 감사합니다. 1) [회원 경로] (http://guides.rubyonrails.org/routing.html#adding-more)를 추가해야합니다. -restful-actions)이'change_folder'에 해당하는 routes.rb 파일에서'get : change_folder'와 같은 것으로, 아약스 호출이 어디에 있는지에 따라 약간 놀아야 할 것입니다. 2) GOTCHA :'change_folder.js.erb'에있는 모든 js 오류는 자동으로 * 실패하므로 아무 이유없이 작동하지 않는 것처럼 보일 수 있습니다.'console.log와 같은 간단한 작업을 통해 js 파일을 테스트하십시오. ...)' – ohhh

+0

컨트롤러에서 추가 매개 변수 (레일즈 5.1.3 사용)를 허용해야합니까? 웬일인지 그것이 나를 위해 일하지 않는다. 나는 당신의 대답과 오하이오의 발언에 계단을 따라갔습니다. 감사! – mabu