2012-07-01 72 views
1

我在我的rails 3應用程序中有一個搜索表單。該表單有一些下拉菜單,用於設置不同的搜索條件。然後表單根據選擇的內容搜索名爲「item」的模型。這會導致正在創建和分頁的項目列表。這是原來的形式標記我用:rails 3遠程窗體ajax的部分形式

<%= form_tag("", :method => "post") do %> 

我當時就想一個「Ajax」的監聽器連接到下拉菜單中的一個(影響另一個下拉列表),我仍然想使用提交表單的其餘部分沒有Ajax的POST(用於「正常」搜索)。 ajax部分僅用於顯示不同的搜索條件。我試過這個表格標籤:

<%= form_for(:itemsbylocation, :remote => true) do |f| %> 

不幸的是,打破了窗體中的某些東西...我無法使用POST提交它。它觸發了一個簡單的javascript,雖然(從js模板),它只是提醒一下。

所以..表單開始作爲一個簡單的形式使用POST,沒有ajax,並且工作正常。然後,我想爲表單的一小部分ajax,只是一個下拉或兩個,所以我嘗試使用「遠程」的另一種形式。我仍然想要主要的搜索(對於項目)使用POST(無Ajax).... 有沒有人在這種情況下有任何提示? 在此先感謝!

編輯

我決定繞過欄杆Ajax「的遙控器」的方式進行的形式爲我的下拉菜單,即我不使用「遠程」,我甚至不使用的形式。也許有這樣做的一些缺點..就像安全問題?,但它適用於我。我只是將這個JavaScript(監聽器)代碼(見下文)添加到一般的JavaScript中。我添加了一個新的控制器操作(categories/category_changed),一個路由和一個js模板。在javascript視圖中,我可以根據需要操作下拉菜單。 ...

$("#type").change(function(){ 
    var catValue = $(this).val();  
    var formaction = "/categories/category_changed/"+catValue; 

    args = "id="+catValue; 
    $.ajax({ 
    type: "GET", 
    url: formaction, 
    data: args, 
    dataType: "script" 
    }) 
}); 

...

結束編輯

一些代碼的...

局部:

<%= form_for(:itemsbylocation, :remote => true) do |f| %> 
    <label class="left search" for="search-inp"> 
       <%= f.text_field :searchstr %> 
      </label> 
     <select class="custom" id="type" name="cat"> 
      <option value=''>Choose category</option> 
     <% @super_categories.each do |supercat| %> 
       <option class="optgroup"><%= supercat.name %></option> 
      <% supercat.category.each do |cat| %> 
       <option <%= highlight_if_selected params[:cat], cat.id %> value='<%= cat.id %>'><%= cat.name %></option> 
       <% end %> 
     <% end %>    
    </select> 

    <select name="loc" class="custom"> 
     <option value=''>Choose location</option>   
      <% @locations.each do |location| %> 
          <option <%= highlight_if_selected @selected_location, location.id %> 
          value='<%= location.id 
          %>'><%= location.name %></option>    
          <% end %> 
    </select> 
      <div class="clr h-small"></div> 
      <div id="buttonset"> 
       <input type="checkbox" 
       <% if get_mode(params, 
       @modes['sell']) %> 
       checked="checked" <% end %> 
       value="<%= @modes['sell'] %>" name="mode_id_<%= @modes['sell'] %>" id="search-1" class="checkbox" /> 
       <label class="checkbox" for="search-1">Selling</label> 
       <input type="checkbox" <% if get_mode(params, 
       @modes['buy']) %> 
       checked="checked" <% end %> 
       value="<%= @modes['buy'] %>" name="mode_id_<%= @modes['buy'] %>" id="search-2" class="checkbox" /> 
       <label class="checkbox" for="search-2">Buying</label> 
       <input type="checkbox" <% if get_mode(params, 
       @modes['to_rent']) %> 
       checked="checked" <% end %> 
       value="<%= @modes['to_rent'] %>" name="mode_id_<%= @modes['to_rent'] %>" id="search-3" class="checkbox" /> 
            <label class="checkbox" 
            for="search-3">Renting</label> 

       <input type="checkbox" <% if get_mode(params, 
       @modes['wish_to_rent']) %> 
       checked="checked" <% end %> 
       value="<%= @modes['wish_to_rent'] %>" name="mode_id_<%= @modes['wish_to_rent'] %>" id="search-4" class="checkbox" /> 
            <label class="checkbox" 
            for="search-4">Wish to rent</label> 
      </div>    

      <!-- input type="submit" class="btn 
      search-btn" value="Search"/--> 
      <%= f.submit %> 



    </div> 

    <% end %> <!-- form --> 

控制器(該js模板只包含一個提醒):

# GET /items/1 
# GET /items/1.json 
def list 
    @selected_location = (params[:loc]) ? params[:loc] : params[:id] 
    @items = Item.search_items(@selected_location, params[:page]) 
    @modes = Mode.modes_for_search 
    @super_categories = Supercategory.find(:all) 
    @locations = Location.locations  
    @subcategories = Subcategory.where(:category_id => params[:cat]).order("name") 

    @has_price_info = true # look up based on category id 
    @show_images=true # look up in params or in user session 

    respond_to do |format| 
    format.html # list.html.erb 
    format.json { render json: @items } 
    format.js 
    end 
end 
+0

哇,你有很多東西在那裏。你可以將你的代碼燒錄到重要的東西上,並將其格式化得更好一些嗎?您是否嘗試過觀看有關動態下拉菜單表單的[railscast 88](http://railscasts.com/episodes/88-dynamic-select-menus?view=comments)? –

+0

順便說一句..是否有可能在軌道中嵌套形式? – Jojje

+0

我找到了我的問題的解決方案,請參閱「編輯」。 – Jojje

回答

0

我找到了我的問題的解決方案,請參閱「編輯」部分。