2016-04-14 12 views
1

Ich habe eine Suchmethode in einer Schiene App ich schreibe. Hier ist ein Auszug.Aufruf an eine Sammlung Weg hält eine ID

Die Absicht ist Regex zu verwenden, um alle Elemente mit einer Beschreibung zu vergleichen, die einer Suchabfrage entspricht. Anschließend werden alle übereinstimmenden Element-IDs als Zeichenfolge an eine andere Seite übergeben. (Dies alles findet in einem Such-Controller statt).

Der Item-Controller fängt dann die ID-Zeichenfolge ab, teilt sie in ein Array auf und zeigt eine Liste der übereinstimmenden Objekte an.

Ich bekomme derzeit jedoch ein Problem, wobei Rails an die redirect_to-Anweisung einen anderen Parameter anfügt (welcher gemäß der Ablaufverfolgung {"id" => "search"} ist) und dann nach einem Artikel mit ID sucht. " :. a1" Es kann offensichtlich finden nicht ein (ids alle numerisch sind) und damit die App abstürzt kann heraus jemand arbeiten, warum dies der Fall ist

IN dER SUCHE CONTROLLER

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 

.? IN DER ELEMENT CONTROLLER

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

Im Fall ist es relevant, das ist (ein sehr kleiner) Teil der Routen-Datei:

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

Antwort

1

Ich empfehle search eine GET-Anfrage machen würde. Stellen Sie sicher, dass der Pfad zu dieser Aktion eine Sammlungsaktion in Ihrer routes.rb ist. Wenn Ihr Controller ItemsController gestattet:

GET /items/search?query=searchterm

EDIT

einfach realisiert die POST in Ihrer Routen:

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

Sie können Ihre Suche params als URL-Parameter übergeben. Sie können nicht auf einen POST-Pfad umleiten, was wahrscheinlich dazu führt, dass Sie merkwürdiges Verhalten bekommen. Ändern Sie die Suchaktion in ein GET und das Problem wird zumindest teilweise gelöst.

Wie gehen Sie auch mit der URL-Codierung um? Zeichen mit Leerzeichen werden in seltsame Werte wie kodiert, die zu den unerwarteten Ergebnissen führen können, die Sie sehen, wenn Sie Dinge wie params[:ids].split aufrufen.

Wenn möglich, würde ich empfehlen, dies in einer einzigen Controller-Aktion zu konsolidieren, anstatt umzuleiten.

+0

Der POST zu GET Änderung behoben es; Vielen Dank –

Verwandte Themen