2016-04-14 2 views
1

私は書いているレールアプリで検索方法を持っています。ここに抜粋があります。コレクションパスへの呼び出しはIDを渡し続けます

目的は、正規表現を使用して、すべてのアイテムを検索クエリと一致する説明と照合することです。次に、一致するすべての項目IDが別のページに文字列として渡されます。 (これはすべて検索コントローラで行われます)。

アイテムコントローラは、その文字列をキャッチし、それらを配列に分割し、一致するオブジェクトのリストを表示します。

しかし、私は現在、問題が発生しています。これは、レールがredirect_to文に別のパラメータ({"id" => "search"}であり、 :A1" 。これは明らかに1(IDはすべての数値です)ので、アプリのクラッシュを見つけることができません。このような場合は、なぜ誰もがうまくできる検索コントローラ内の

rquery = Regexp.new(Regexp.escape(@query), Regexp::IGNORECASE) 
item_list = [] 
Item.all.each{|item| item_list << item if rquery.match(item.shortdescr)} 

unless item_list == nil 
    ids = "" 

    maybe_matters.each do |matter| 
     ids += item.id.to_s + " " 
    end 

    redirect_to search_items_path(ids: ids) 
    return 
end 

。? アイテムコントローラ内

def search 
    authorize! :show, Item 
    @id = params[:ids].split 
    @search = [] 
    @id.each do |id| 
     @search << id.to_i 
    end 

    @items = Item.accessible_by(current_ability).where(id: @search).order('completed desc nulls last').page params[:page] 
end 

EDIT

場合、それは、関連するだ、これはルートファイルの(非常に小さい)部分です:

resources :items, only: [:index, :show] do 
    collection do 
     post :search 
    end 
end 

答えて

1

私はsearch GET要求を行うことをお勧めしたいです。そのアクションのパスがroutes.rbの収集アクションであることを確認してください。お使いのコントローラがItemsController命名されている場合:

resources :items do 
    get 'search', on: :collection 
end 

あなたはURLパラメータとして検索のparamsを渡すことができます。

GET /items/search?query=searchterm

EDIT

はちょうどあなたのルートでPOSTを実現。おそらくあなたが奇妙な動作をしているのかもしれないPOSTパスにリダイレクトすることはできません。検索アクションをGETに変更すると、問題は少なくとも部分的に解決されます。

また、URLエンコーディングをどのように処理していますか?スペースを含む文字は、のようなものを呼び出すと表示される予期しない結果をもたらすかもしれない%20のような奇妙な値にエンコードされます。

可能であれば、これをリダイレクトするのではなく、1つのコントローラアクションに統合することをおすすめします。

+0

POST to GET changeが修正されました。ありがとう –