我在我的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
哇,你有很多東西在那裏。你可以將你的代碼燒錄到重要的東西上,並將其格式化得更好一些嗎?您是否嘗試過觀看有關動態下拉菜單表單的[railscast 88](http://railscasts.com/episodes/88-dynamic-select-menus?view=comments)? –
順便說一句..是否有可能在軌道中嵌套形式? – Jojje
我找到了我的問題的解決方案,請參閱「編輯」。 – Jojje