2016-12-10 2 views
0

Ich habe eine Kategorie und ein Produktmodell, wo das Produktmodell zu einer Kategorie gehört. Momentan habe ich einen Link in der Kategorie Showansicht, der den Benutzer zu einem neuen Produktformular führt und die Kategorie-ID als die Kategorie festlegt, aus der der Benutzer den Link geklickt hat.Handle-Parameter fehlende Ausnahme in Schienen

Um es klarer zu machen: Benutzer wählt eine Kategorie> Benutzer klickt neuen Produktlink in der Kategorie show view> Produktformular öffnet sich mit der Kategorie ID, die als vorherige Kategorie festgelegt wurde.

Das Problem, das ich habe, ist, dass, wenn der Benutzer zu/products/new geht, ein Parameter fehlende Ausnahme, da die Kategorie ID nicht gefunden werden kann (da eine Kategorie nicht mit der Adresse Anfrage gesendet wird).

Gibt es eine Möglichkeit, dass ich damit umgehen kann, um zu verhindern, dass der Benutzer einfach die/products/new Adresse eingibt und versucht, auf das Formular zuzugreifen? Ich möchte, dass der Benutzer nach Hause umgeleitet wird, wenn er versucht, ein neues Produkt zu erstellen, ohne auf den Link auf einer Kategorieseite zu klicken.

Mein Code für die Produktsteuerung (relevant zu dieser Frage):

def new 
    @product = @category.products.new 
    end 

def set_category 
     @category = Category.find_by(id: params[:category_id]) || Category.find(product_params[:category_id]) 
     rescue ActiveRecord::RecordNotFound 
    end 

private 
    def product_params 
     params.require(:product).permit(:category_id, :title, :description, :image_url, :price) 
    end 

Link zu neuem Produkt auf Kategorie anzeigen Seite gefunden:

%p= link_to t('.add'), new_product_path(category_id: @category) 

Methode der Ausnahme Punkte auf:

def product_params 
    params.require(:product).permit(
     :category_id, :title, :description, :image_url, :price) 
end 

Jede Hilfe wäre willkommen, und es tut mir leid, wenn dies ein wenig unklar war.

+0

Wie sehen Ihre Routen aus? Vielleicht brauchen Sie geschachtelte Ressourcen, so dass es keine '/ products/new' Route gibt. Außerdem brauchen Sie nicht 'find_by',' find' und 'rescue' für' @ category'; Wenn Ihre Routen richtig eingerichtet sind und 'set_category' an die richtigen Controller-Methoden gebunden ist, dann genügt ein' Category.find'-Aufruf und die übliche Rails 'RecordNotFound'-Behandlung sollte ausreichen. –

+0

Derzeit habe ich: 'Ressourcen: Kategorien' ' Ressourcen: Produkte' in separaten Zeilen. Ich nehme an, Sie wollen es mit einer do-Klausel einrichten und Produkte unter Kategorien verschachtelt? – Isengrim

Antwort

1

Warum nicht einfach eine Bedingung zu Ihrer neuen Aktion hinzufügen, die auf die Existenz des Parameters hin überprüft?

unless params[:category_id].present? 
    redirect_to somewhere 
end 
+0

Ich habe das versucht, aber ich bekomme immer noch die selbe Ausnahme. Es zeigt auf def product params-Methode (ich werde es in meinem ursprünglichen Beitrag), und geben Sie die Nachricht "param fehlt oder der Wert ist leer: Produkt" – Isengrim

+1

versuchen Sie es in einem 'before_filter 'statt – toddmetheny

+0

Perfekt, arbeitete a Charme. Vielen Dank, wird als Antwort markieren. – Isengrim

Verwandte Themen