2017-10-02 4 views
1

Diese App hat die folgenden Modelle:Rails bilden - mehrere verschachtelte Routen nicht definierte Methode '_path'

  1. Farm (has_many: Kulturen)
  2. Crop (belongs_to: Bauernhof, has_many: Ausgaben)
  3. Ausgabe (belongs_to: crop)

Hier sind die Routen:

resources :farms do 
    resources :crops do 
    resources :issues 
    end 
end 

Ich möchte, dass ein Benutzer in der Farm # show-Seite ein neues "Problem" erstellen kann, das alle Feldfrüchte der Farm auflistet. Hier ist die Form, die den Fehler auf der Farm # show Seite verursacht:

nicht definierte Methode `crop_issues_path‘ für # < #: 0x007fa814a3cc30>

#from the show action on the controller: 
#@farm = Farm.find(params[:id]) 
#@crops = @farm.crops 

<% @crops.each do |crop| %> 
<%= crop.id %> 
    <%= form_for([crop, crop.issues.build]) do |f| %> 
    <%= f.select(:issue_type, options_for_select([['mold'], ['pests'], ['dehydration'], ['other']])) %> 
    <%= f.text_area :notes %><br> 
    <%= f.submit "New Issue", :class => "button" %> 
    <% end %> 
<% end %> 

Aktionen zu Themen Controller erstellen My:

def create 
    @crop = Crop.find(params[:crop_id]) 
    @issues = @crop.issues.create(params[:issue].permit(:issue_type, :notes, :crop_id)) 

    redirect_to :back 
    end 

Ich habe fast identischen Code verwendet, wenn die Ernten und Probleme nicht unter Farmen geschachtelt wurden, und es funktioniert. Ich glaube, das Problem liegt an der Verschachtelung, kann aber keine Lösung finden.

Antwort

1

Ich denke, dein Problem ist mit dem Objekt, das du an das Formular bingst. Es sollte @farm sein, da Sie in der Aktion @farms show sind.

ich es so weit geändert:

<% @crops.each do |crop| %> 
<%= crop.id %> 
    <%= form_for([@farm, crop, crop.issues.build]) do |f| %> 
    <%= f.text_area :notes %><br> 
    <%= f.submit "New Issue", :class => "button" %> 
    <% end %> 
<% end %> 

mit meinem Controller wie folgt aus:

class FarmsController < ApplicationController 
    def index 
    end 

    def show 
    @farm = Farm.find_by_id(params[:id]) 
    @crops = @farm.try(:crops) 
    end 
end 
+0

die "@farm" in der form_for Zugabe schien zu sein, was das Problem behoben haben! nicht vertraut mit dem "@ farm.try (: crops)" und wie es sich von "@ farm.crops" unterscheidet - was ist der Unterschied? – user1510700

+0

Ah, sorry, das war mein Faulenzen - ich wollte keine Ernten in meine db hinzufügen, um das Szenario zu testen, also fügte ich '.try()' hinzu, damit es nicht mit Nullwert für '@ crops' explodierte – Andrew

Verwandte Themen