Ruby on rails 使用下拉字段的Rails查找表单

Ruby on rails 使用下拉字段的Rails查找表单,ruby-on-rails,forms,activerecord,select,Ruby On Rails,Forms,Activerecord,Select,我想这应该是非常直截了当的,在毫无结果的搜索之后,它似乎太简单了 我有两种模式:客户模式和工作模式。客户机有许多作业,作业属于客户机 在my routes.rb中,我有一个嵌套资源,如下所示: resources :client do resources :job end 手动输入以下路径时不会解决任何问题: /client/:client_id/job 我想要的是在作业索引页面上有一个简单的单字段下拉选择表单,该表单列出所有客户机,提交时使用所选客户机id指向上述路径 我在view/

我想这应该是非常直截了当的,在毫无结果的搜索之后,它似乎太简单了

我有两种模式:客户模式和工作模式。客户机有许多作业,作业属于客户机

在my routes.rb中,我有一个嵌套资源,如下所示:

resources :client do
  resources :job 
end
手动输入以下路径时不会解决任何问题:

/client/:client_id/job
我想要的是在作业索引页面上有一个简单的单字段下拉选择表单,该表单列出所有客户机,提交时使用所选客户机id指向上述路径

我在view/job/index.erb中有以下表单

<%= form_tag( client_index_path, :action => 'index', :method => 'get' ) do %>
  <%= collection_select ("job", "client_id", Client.all, "id", "name", {:include_blank => 'Filter by client'}) %>
  <%= submit_tag 'Go' %>
<% end %>
这是rails生成的HTML:

<select id="job_client_id" name="job[client_id]">
  <option value="">Filter by client</option>
  <option value="1">client1</option>
  <option value="2">client1</option>
  <option value="3">client2</option>
</select>

按客户端筛选
客户1
客户1
客户2

非常感谢您的帮助,谢谢您

如果没有任何javascript,您无法通过纯html实现这一点。表单总是提交到一个URL,任何数据都通过POST或GET参数提供(即/client之后的内容?)

有两种选择

如果您可以依赖启用的javascript,那么劫持submit按钮来构造URL。大概是这样的:

$("#form").submit(function(){
  client_id = $("#job_client_id").val();
  window.location = '/client/' + client_id + '/job/';
  return false; // don't sumbmit the form
})
编辑:下面是一个工作示例:


第二个选项是将表单提交到服务器,并在那里重定向。这是一个额外的服务器调用,但在没有javascript的情况下也可以工作。您需要创建一个特殊的控制器操作,该操作可以理解表单,并使用
重定向\u到
行谢谢!我想javascript解决方案就快到了。我是否也需要在表单中添加onsubmit或action?是的,很抱歉,我的示例代码使用了jquery,因为它更简洁。如果您使用的是纯JS,那么您需要为表单设置onsubmit处理程序(这就是$(“#form”).submit(处理程序)在加载jQuery时所做的)。非常感谢-我加载了jQuery。它似乎仍然没有拾取选定的值。我尝试过调试,似乎可以获得下拉列表的第一个选定文本值(使用.text和函数的后半部分),但当我将其替换为.value时,它不会返回选定的值。不确定我做错了什么。有关从选择框中获取值的示例,请参阅我的编辑再次感谢该峰值。我让您的示例用于一个简单的表单,但当我将其切换为使用rails生成的表单时,警报返回“undefined”。rails生成的HTML看起来与示例完全相同,因此我不确定发生了什么。如果你有更多的时间,那么任何更多的建议都会很好,但是如果你已经花了足够的时间,请理解!
$("#form").submit(function(){
  client_id = $("#job_client_id").val();
  window.location = '/client/' + client_id + '/job/';
  return false; // don't sumbmit the form
})