2016-09-02 4 views
0

Hallo StackOverflow :), Ich habe eine Frage zu einem Collection_Select in einem Formular.Rails - Zurückgeben eines Zeichenfolgenwerts in collection_select

Zuerst ist die Sammlung auswählen ein Filter in einer Suchmaske und die Anzeige der Auswahl funktioniert, das Problem ist der Wert an die Anfrage übergeben.

Bevor ich hatte eine text_field_tag ​​was in Ordnung arbeitet:

<% text_field_tag :book_name, params[:book_name], placeholder: 'Book' %> #Text field Works 

Rückkehr der param in der Konsole "Book_name"=>"Harry Potter"

Zweite Wahl mit der Sammlung auswählen:

<%game = Book.find_by name: params[:book_name] %> 
<% collection_select(:book, :book_name, Book.all, :id, :name, {selected: book.try(:id)}, prompt: true) %> 

Return dies in der Konsole: "book"=>{"book_name"=>"2"} und ich würde wie genau das gleiche zurück, wie oben

"book_name" => "Name" 

Hier ist die Search-Controller, vielleicht sollte ich diese ändern?

def search 
    if params[:book_name].present? 
     @searchs = User.joins(:books).where(books: {name: params[:books_name]}).near(params[:city], params[:distance] || 10) 

    elsif params[:city].present? 
     @searchs = User.near(params[:city], params[:distance] || 10).where("id != ?", current_user.id) 

    else 
     @searchs = User.none 

Ich hoffe, jemand könnte mir dabei helfen. Ich habe viele verschiedene Möglichkeiten ausprobiert, aber nichts hat funktioniert! Vielen Dank im Voraus !

Antwort

1

können Sie beide Dinge tun. Wenn Sie es vorziehen, das Buch Namen übergeben Sie

<% f.collection_select(:book, :book_name, Book.all, :name, :name, your_options = {}, your_html_options = {} %> 

(beachten Sie die Doppel :name, der erste Wert für die Option und die zweite ist für die Option Text)

verwenden sollten

Aber lassen Sie mich sagen, eine Suche nach Namen ist nicht die beste Praxis. Die Abfrage nach Zeichenfolgen ist extrem langsamer als die Verwendung einer ID. Also, wenn ich du wäre, ich werde die collection_select halten wie, und ich werde die Suche ändern Sie die ID wie folgt aus:

 @searchs = User.joins(:books).where(books: {id: params[:books_id]}).near(params[:city], params[:distance] || 10) 

oder sogar

@searchs = User.joins(:books).where('book_id = ?', params[:book_id]).near(params[:city], params[:distance] || 10) 

Wenn Sie mehr Zweifel haben, werfen Sie einen Blick auf die collection_selectdocumentation

+0

Danke für diese Antwort, ich bevorzuge IDs zu verwenden, viel besser für die Suche.Perfekte Antwort, ich werde das versuchen und euch auf dem Laufenden halten;) –

+0

Vielleicht könntest du mir dabei helfen, ich habe immer noch den param so, wenn ich die Suche einlege "book" => {"book_name" => "2"} ', mit dem Doppelpfeil, kennst du eine Möglichkeit, dies zu' book_name => 2 'zu ändern und den ersten Pfeil zu überspringen? Oder muss ich etwas im Search Controller ändern? Es tut mir leid, ich bin ein bisschen neu zu Schienen –

+0

Welche Version von Schienen verwenden Sie? (verwenden Sie string_parameters in Ihrem Controller?) Wie auch immer .. Ich verstehe nicht sehr gut Ihre Frage .. meinst du tun 'params [: Buch]' Sie bekommen '{" Buch_Name "=>" 2 "}' ? –

1

Sie :id

<% collection_select(:book, :book_name, Book.all, :id, :name, {selected: book.try(:id)}, prompt: true) %> 

Auf diese Weise Sie Rückkehr Rückkehr ': Name'

<% collection_select(:book, :book_name, Book.all, :name, :name, {selected: Book.find_by_name(:name)}, prompt: true) %> 
+0

Dank es funktionierte, änderte nur die ausgewählte mit einem Kapital für "Game.find_by_name". Danke Steve –

+0

Keine Probs, Martin .... guten Fang über das "Spiel" (oder "Buch") wird groß geschrieben. Ich habe die Antwort aktualisiert. – SteveTurczyn

Verwandte Themen