0

Diese App hat 2 Modelle, eine Farm has_many Crops. Wir versuchen, Ransack zu verwenden, um die Suche in Farm # show durchzuführen. Die Show Aktion in der Steuerung wie folgt aussieht:Rails Search Ransack NoMethodError

def show 
    @farm = Farm.find(params[:id]) 
    @q = @farm.crops.ransack(params[:q]) 
    @crops = @q.result(distinct: true) 
    end 

The Farm # zeigen Ansicht dieses Formular enthält:

<%= search_form_for @q do |f| %> 
    <div> 
    <%= f.label :croptype_cont, "Crop Name Contains:" %> 
    <%= f.text_field :croptype_cont %> 
    </div> 
<%= f.submit "search" %> 
<% end %> 

Alles sieht richtig für mich, aber wir halten diesen Fehler - es hebt die erste Zeile des Suchformulars:

NoMethodError in Farms # show
nicht definierte Methode `crops_path‘

Was fehlt hier?

Antwort

0

Da die Rarensacksuche standardmäßig zur Indexaktion geht, können Sie in der Dokumentation crops_path sehen. Hier müssen Sie eine separate Aktion für die Suche schreiben. oder Sie können

1- wie diese tun, um Ihre Show Aktion modify und nur @q als Suchvariable

def show 
    @farm = Farm.find(params[:id]) 
    @q = @farm.crops.ransack(params[:q]) 
    end 

2- erstellen Sie eine separate Aktion für die Suche definieren ex-

def search_crops 
    @farm = Farm.find(params[:id]) 
    @q = @farm.crops.ransack(params[:q]) 
    @crops = @q.result(distinct: true) 
end 

3- definieren url für search_crops

get 'search/farm/crops', to: 'farms#search_crops', as: :crops_search 

4- in farms/show.html.erb ein verstecktes senden der Bereich id Farm zu erhalten, bevor Kulturen im Zusammenhang mit Land

<%= search_form_for @q, url: crops_search_path, :html => { :method => :get } do |f| 
    <%= f.hidden_field :id, value: params[:id] %> 
    <div> 
    <%= f.label :croptype_cont, "Crop Name Contains:" %> 
    <%= f.text_field :croptype_cont %> 
    </div> 
<%= f.submit "search" %> 
<% end %> 

5- so nach dem Aufstehen @crops von search_crops Aktion der Suche können Sie entweder gemeinsamen Teil sowie search_crops.html.erb und Anzeige Suche nach show.html.erb machen kann results.You ändern Sie Ihre Code entsprechend