Rails 3 アプリに検索フォームがあります。このフォームには、さまざまな検索基準を設定するために使用されるいくつかのドロップダウン メニューがあります。フォームは、選択されたものに基づいて、"item" と呼ばれるモデルを検索します。これにより、アイテムのリストが作成され、ページ付けされます。これは私が使用した元のフォームタグです:
<%= form_tag("", :method => "post") do %>
次に、ドロップダウン メニューの 1 つに「ajax」リスナーをアタッチして (別のドロップダウンに影響を与えるため)、ajax を使用せずに POST を使用して残りのフォームを送信したい (「通常の」検索用)。ajax 部分は、さまざまな検索条件を表示するためだけのものです。このフォームタグを試しました:
<%= form_for(:itemsbylocation, :remote => true) do |f| %>
残念ながら、フォームの何かが壊れています... POSTを使用して送信できなくなりました。ただし、(jsテンプレートから)単純なjavascriptをトリガーし、アラートのみを生成します。
だから..フォームは、AjaxなしでPOSTを使用した単純なフォームとして開始され、正常に機能しました。次に、フォームのごく一部、ドロップダウンを 1 つまたは 2 つだけ ajax にしたかったので、「リモート」を使用して別のタイプのフォームを試しました。私はまだメインの検索(アイテムの)でPOST(Ajaxなし)を使用したい....この場合、誰かヒントはありますか?前もって感謝します!
編集
ドロップダウンのフォームに Rails 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