2012-06-21 22 views
4

有一個下拉使用select平變化顯示/改變部分

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

有一個部分叫做「形式」

<%= render "form"%> 

我需要使局部每當有一個變化選擇。請讓我知道是否有辦法做到這一點。我發現remote_function已從rails 3.0中棄用。我看到所有可能的鏈接在這裏與onchange和選擇標籤,但無法找到正確的答案。我是rails,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> 

我你還想讓一個Ajax請求我很簡單,太

$(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服務器端

使用format.js並呈現模板的AJAX請求指引使用渲染命令或只是定義.js.erb文件

+0

謝謝,看來問題解決了,我會回來,如果我需要更多的細節 – user1455116

11

肯定是有辦法做到這一點,它的一些工作,但一旦你得到了它的竅門它很容易。

首先,您需要在選擇框的change事件中附加jQuery函數。這可以通過在application.js文件中添加一些javascript來完成。我們想在這裏這樣做,所以我們的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 
    }) 
}); 

這樣做是附加一個匿名函數的change事件選擇字段的id爲select_field_id。當該字段發生更改時,所選選項的id將存儲在變量id中,然後我們將通過執行var params = 'some_id=' + id;爲請求創建一個參數。 some_id將會是你正在改變的標識(所以如果這就是你在示例中使用的folder_id)。

現在我們需要在我們的控制器中創建處理這個請求的方法。因此,與該文件夾例如去,將其添加到該文件夾​​控制器:

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

這可以簡單地認爲基於您的Ajax請求發送到change_folder id的文件夾。它也將尋找相應的change_folder.js.erbchange_folder.js文件來呈現。

現在我們需要編寫一個change_folder.js.erb文件。我們需要用我們獲得的新文件夾替換頁面某些部分的HTML,因此您應該使用某種div或其他部分的唯一ID。

裏面change_folder.js.erb,我們可以這樣寫:

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

,這會使得部分稱爲_folder.html.erb是在同一目錄中change_folder.js.erb文件。該部分將需要使用@folder變量用於顯示領域,所以你會需要這樣的東西:

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

裏面你_folder.html.erb部分。 .name.last_updated當然只是組成Folder文件夾的屬性。您必須使用您提供給Folder模型的任何屬性。

這應該讓你去你需要的地方。如果您需要澄清任何事情,請告訴我。

+0

非常感謝,因爲IAM全新的Rails,JQuery,Ajax需要一些時間來創建一個。 js.erb文件並從中渲染一個部分。目前@viren解決了我的問題。 – user1455116

+0

謝謝你這麼多的寫了@Zajn,我遇到了幾件事情: 1)你需要添加[成員航線(http://guides.rubyonrails.org/routing.html#adding-more在這種情況下,您的routes.rb文件中對應於'change_folder'的路徑.rb文件中,您可能必須稍微調整一下,具體取決於ajax調用的位置。 2)GOTCHA:'change_folder.js.erb'中的任何js erros將會*無提示*失敗*因此它看起來可能無法正常工作,請確保通過做一些簡單的事情來測試js文件,例如'console.log ...)' – ohhh

+0

我還必須在控制器中允許額外的參數(使用Rails 5.1.3)嗎?出於某種原因,它不適合我。我已經按照你的回答中的步驟和ohhh的評論。謝謝! – mabu