2016-05-24 16 views
1

Ich möchte, dass mein Suchformular für alle URLs funktioniert, anstatt auf die Nachrichtenseite umzuleiten. Zum Beispiel auf der Suche nach "hallo":Rails-Suchformular ohne Pfad

on /messages return /messages?utf8=✓&search=hi&commit=Search 

on /posts return /posts?utf8=✓&search=hi&commit=Search 

In meiner Anwendung Ansicht (Bootstrap-Styling):

<%= form_tag(messages_path, :method => "get", class: "navbar-form navbar-left") do %> 
    <div class="form-group"> 
      <%= text_field_tag :search, params[:search], placeholder: "Search", class: "form-control" %> 
    </div> 
    <%= submit_tag "Search", class: "btn btn-default" %> 
<% end %> 

Nachrichten Controller:

def index 
    if params[:search] 
     @messages = Message.search(params[:search]).order("created_at DESC") 
    else 
     @messages = Message.all.order("created_at DESC") 
    end 
end 

Benutzer-Controller:

def index 
    if params[:search] 
     @users = User.search(params[:search]).order("created_at DESC") 
    else 
     @users = User.all.order("created_at DESC") 
    end 
end 

Nachrichtenmodell:

def self.search(search) 
    where("title LIKE ?", "%#{search}%") 
end 

User-Modell:

def self.search(search) 
    where("username LIKE ?", "%#{search}%") 
end 

Wenn ich kopieren und einfügen, um die Parameter (?utf8=✓&search=hi&commit=Search) auf die Seiten, sie funktionieren gut. Ich habe versucht, messages_path aus dem Formular zu entfernen, aber ich habe einen Fehler erhalten. Wie verwende ich einen Formularpfad, der sich abhängig davon ändert, von welchem ​​Controller ich ihn verwende?

Antwort

1

sollten Sie in der Lage sein messages_path mit url_for zu ersetzen, die den Hash-Controller/Aktion umfasst:

<%= form_tag(url_for(controller: controller_name, action: "search"), :method => "get", class: "navbar-form navbar-left") do %> 

Dies gibt Ihnen die /#{controller_name}/search Pfad basierend auf welcher Controller die Formularansicht dient.

Wenn Sie die Suche wollen auf den Index zu gehen, verwenden Sie einfach diese Variante:

<%= form_tag(url_for(controller: controller_name, action: "index"), :method => "get", class: "navbar-form navbar-left") do %> 

und es wird das Formular /#{controller_name}, statt zu senden.

+0

Danke, funktioniert wunderbar! – Robert