2017-08-01 52 views
-2

我有以下型号搜索car_brand_id领域。 CarBrand其中只有:名称字段和has_many:汽车Rails的动态在模型

在视图中我有一个类似如下洗劫搜索表单:

<%= search_form_for(@q, url: search_result_path) do |f| %> 

    <%= f.select(:year_eq, 1960..(Date.today.year+1), {prompt: 'year'}, class: "grey-text") %> 
    <%= f.collection_select :car_brand_id_eq, CarBrand.all, :id, :name, {prompt: 'brand'}, class: "grey-text" %> 
    <%= f.collection_select :model_eq, Car.models, :model, :model, {prompt: 'model'}, class: "grey-text " %> 
    <%= f.button "Search" %> 

<% end %> 

我想使形式的搜索动态的,例如,如果用户在表单中选择一个特定的一年中,下一个字段(:car_brand_id)仅返回具有上一年选择的选择的选项,下一个字段以此类推。提前致谢。

+1

没有“轨道”的方式来做到这一点。你必须使用Javascript来调用你的Rails服务器来获取内容然后更新DOM。 Google“javascript ajax”,“javascript onchange事件”和“javascript改变DOM”开始。如果您熟悉它,我建议使用'jquery'。当然,如果您遇到困难,您可以随时使用破损的代码回到这里,我们很乐意帮助您解决问题。 – eiko

回答

0

我对这样的问题有特殊的理解力,因为我花了很长时间才弄清楚类似的事情。所以,一般应该是这样的:

  1. 设置您:car_brand_eq collection_select用一个实例变量,你可以作为一个Ajax调用,您可以参考它的类的结果更新。变化:

    <%= f.collection_select :car_brand_eq, CarBrand.all... 
    

    到:

    <%= f.collection_select :car_brand_eq, @car_brands, :id, :name, {prompt: 'brand'}, class: "grey-text car-brand-collection" %> 
    
  2. 设置您的AJAX调用:

    要么抢<%= f.select(:year_eq...的ID jQuery中使用或添加一类独特的名字了:

    <%= f.select(:year_eq, 1960..(Date.today.year+1), {prompt: 'year'}, class: "grey-text year-selector") %> 
    

    然后脚本:

    <script> 
        $(document).on("change", ".year-selector", function() { 
        $.ajax({ 
         url: "/car_brands/search.js", 
         // now pass params[:year] as a query string 
         data: { year: $(".year-selector").val() }, 
         type: "GET" 
        }); 
        }); 
    </script> 
    
  3. 现在设置你的search_car_brands_path路线,然后逻辑car_brands_controller.rb,或任何其他控制器可以使用:

    的routes.rb(an explantion of this routes logic here)

    resources :car_brands do 
        collection do 
        # search_car_brands_path 
        get :search 
        end 
    end 
    

    car_brands_controller.rb

    ... 
    # GET /car_brands/search 
    # search_car_brands_path 
    def search 
        # not knowing how exactly you filter CarBrands by year, I'm guessing: 
        @car_brands = CarBrand.where(year: params[:year]) 
    end 
    
  4. 最后。现在你只需要设置search.js.erb在:

    的意见/ car_brands/search.js.erb

    // grab that car-brand-collection selector from step 1 & update it 
    $(".car-brand-collection").html("<%= f.collection_select :car_brand_eq, @car_brands, :id, :name, {prompt: 'brand'}, class: "grey-text car-brand-collection" %>"); 
    

这些步骤。我没有测试过它们,但你应该能够从这里解决它。

+0

非常感谢撒玛利亚人! – user3754535