2017-08-01 77 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