2011-10-30 34 views
11

我有以下選擇列表。帶ajax動作的Rails select_tag(Rails 3和jQuery)

<%= select_tag "project_id", options_from_collection_for_select(@projects, "id", "title") %> 

當用戶從上面的列表中選擇一個選項時,根據上述選擇,下面的列表應該填入來自數據庫的值。

<%= select_tag "version_id", options_from_collection_for_select(??project.versions??, "id", "title") %> 

我想我應該使用onchange事件,但我不知道如何使用它。 有人幫助我。 謝謝!

+1

看到這個[這個問題](http://stackoverflow.com/questions/5472045/multilevel-select-on-rails) – rubyprince

+0

@rubyprince我已經寫了關於軌道3(!!)。在Rails 3 –

+0

oh ..sorry中不存在remote_function,在這種情況下,您可以用jQuery中的某些東西替換onchange函數...我會用它發佈一個答案... – rubyprince

回答

25

的Javascript

function update_versions_div(project_id) { 
    jQuery.ajax({ 
    url: "/update_versions", 
    type: "GET", 
    data: {"project_id" : project_id}, 
    dataType: "html" 
    success: function(data) { 
     jQuery("#versionsDiv").html(data); 
    } 
    }); 
} 

控制器

def edit 
    @projects = Project.all 
    @versions = Version.all 
end 

def update_versions 
    @versions = Version.where(project_id => params[:project_id]).all 
    render :partial => "versions", :object => @versions 
end 

查看

<%= select_tag "project_id", options_from_collection_for_select(@projects, "id", "title"), :prompt => "Select a project", :onchange => "update_versions_div(this.value)" %> 
<div id="versionsDiv"> 
    <%= render :partial => 'versions', :object => @versions %> 
</div> 

部分:_version.html.erb

<%= select_tag "version_id", options_from_collection_for_select(versions, "id", "title"), :prompt => "Select a version" %> 

另外在你的routes.rb中添加對/update_versions路線

match "/update_versions" => "<controller>#update_versions" 

在這裏,你應該與控制器的名稱替換<controller>

我還沒有測試代碼,所以可能有錯誤。

更新

PullMonkey已更新使用Rails 3爲例,這是比這個代碼明顯優於代碼。請結帳http://pullmonkey.com/2012/08/11/dynamic-select-boxes-ruby-on-rails-3/

+0

在安全性方面的一些改進和活動記錄處理: '@versions = Version.where('project_id =?',params [:project_id])第一個' where子句當前存在安全漏洞。直接放入字符串可能會使查詢對惡意內容開放。此外,它目前正在抓取ActiveRecord:Relation而不是對象本身。因此,添加第一種方法將解決此問題。 – JellyFishBoy

+0

嗨@ JellyFishBoy ..這裏有兩件事: - 'Version.where(project_id => params [:project_id])' - 這'where'子句並沒有留下安全漏洞,據我所知。我不直接放置字符串,而是傳遞一個散列。這是Rails寫作條件的慣用方式。如果我們將它作爲散列提供,Rails會執行安全處理。請參閱[Rails指南](http://guides.rubyonrails.org/active_record_querying.html#hash-conditions) – rubyprince

+0

@ JellyFishBoy ..關於'.first',我的意圖不是獲取第一條記錄,而是獲取所有記錄,與項目ID。你說對了,它返回一個activerecord關係,它會馬上激發查詢,但是這個activerecord關係只要像'inspect','each'這樣的方法被調用就會觸發查詢。所以,代碼將起作用,但我同意明確調用最好。我會補充一點。 – rubyprince