2016-04-05 8 views
-1

Meine AnsichtMein Code überspringt die Ansicht und geht direkt in den Controller. Ruby on Rails

<h1>Return a Book</h1> 
<%= form_tag("/orders/returnB", method: "get") do %> 
    <div class="form-group"> 
    <%= label_tag :ID, "ID" %> 
    <%= text_field_tag :ID, nil, class: "form-control" %> 
    </div> 
    <%= submit_tag "Submit", class: "btn btn-default" %> 
<% end %> 

Mein Controller

def returnB 
    getid = params[:ID] 
    @order = Order.find(getid) 
    @order.destroy 
    respond_to do |format| 
    format.html { redirect_to orders_url, notice: 'Order was destroyed.' } 
    format.json { head :no_content } 
    end 
end 

sein Gehen, nur direkt an den Controller und als mein Controller nicht die ID bekommen konnte, so dass es einen Fehler geben. Also ich dies in meiner Route tue:

get 'orders/return' => 'orders#returnB'

+1

Was meinen Sie es "direkt an die Steuerung geht"? Alles geht zuerst zum Controller. Welche URL triffst du? Wie sieht dein Routing aus? Ich würde auch stark darüber nachdenken, mit normalen Namenskonventionen für Parameter fortzufahren. Und richtig einrücken. –

+0

Das liegt daran, dass Sie es geroutet haben, um zur Methode 'returnB' des Controllers zu gehen. Schienen treffen immer zuerst den Controller. Sie sollten auch keine get-Anfrage verwenden, um eine Bestellung zu vernichten. Können Sie erklären, welche Funktionalität Sie erreichen möchten? Sie möchten die Ansicht anzeigen, dann füllt der Benutzer das Formular aus und bei der Einreichung wird die Bestellung vernichtet? –

+0

in Sicht Sie erwähnen Methode:: Get und im Controller einige Operation zu tun –

Antwort

0

In einem einfachen Schiene fließt die Anforderung zuerst den Controller trifft und dann die Ansicht Vorlage mit demselben Namen wie der Controller, wiedergegeben wird.

Ich glaube, Sie haben Ihre Form definiert in

view/orders/returnB.erb 

Deshalb ist die Anforderung, den Controller trifft zuerst, bevor Sie das Formular zu machen. Ich schlage vor, dass Sie das Formular in eine andere Ansichtsvorlage verschieben.

+0

Wo sollte ich es sonst platzieren. Es wird ein Fehler der fehlenden Vorlage geben. –

+0

Sie können das Standardverhalten verhindern, indem Sie den Fluss an einen anderen Controller umleiten oder einen Renderpfad einer anderen Ansichtsvorlage angeben. Können Sie bitte detailliert beschreiben, was Sie hier erreichen wollen? Und welche anderen Ansichtsvorlagen haben Sie in Ihrem Ansichtsverzeichnis? –

0

Ihre Routen ändern:

delete 'orders/return' => 'orders#return_order' 

löschen sollte zerstören verwendet werden.

ändern Form:

<h1>Return a Book</h1> 
<%= form_tag("/orders/return", method: "delete") do %> 
<div class="form-group"> 
    <%= label_tag :ID, "ID" %> 
    <%= text_field_tag :ID, nil, class: "form-control" %> 
</div> 
<%= submit_tag "Submit", class: "btn btn-default" %> 
<% end %> 

ändern Aktionsnamen returnB-return_order, da es nicht die richtige Konvention ist es, eine Methode Namen zu schreiben.

Change-Controller-Code:

def return_order 
    @order = Order.find_by_id(params[:ID]) 
    @order.destroy 
    respond_to do |format| 
    format.html { redirect_to orders_url, notice: 'Order was destroyed.' } 
    format.json { head :no_content } 
    end 
end 
+0

Nein, es funktioniert nicht mit löschen. –

+0

posten Sie bitte Ihre Stack-Trace. – dp7

+0

'return' ist ein reserviertes Wort. Ich bin mir nicht sicher, ob Sie damit eine Methode definieren können. http: //www.rubymagic.org/posts/ruby-and-rails-reservierte-wörter – sshah