2011-10-30 33 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