2008-12-30 3 views
36

Ich bin neu bei Ruby on Rails, ich habe die Blog Tutorial abgeschlossen.Hinzufügen einer Aktion zu einem vorhandenen Controller (Ruby on Rails)

Ich versuche jetzt eine zusätzliche Aktion, namens 'Start', zum Controller hinzuzufügen.

def start 
end 

Ich habe eine Ansichtsseite "app/views/posts/start.html.erb" enthält nichts anderes als einfache HTML hinzugefügt.

Wenn ich zu/posts/starte gehe ich den folgenden Fehler.

Ich verstehe den Fehler, die Show-Aktion wird ausgeführt und Start ist keine gültige ID. Warum wird die Start-Aktion nicht ausgeführt? Gibt es einen Teil der MVC-Architektur oder -Konfiguration, die ich vermisse?

Unten ist mein posts_controller.rb

class PostsController < ApplicationController 

    # GET /posts/start 
    def start 
    end 

    # GET /posts 
    # GET /posts.xml 
    def index 
    @posts = Post.find(:all) 
    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.xml 
    def show 
    @post = Post.find(params[:id]) 
    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

end 

Ja ich neu gestartet haben den Server und versucht, es mit Mongrel und webrick.

+0

Bitte wiederholen ... "on" sollte kein Tag sein – andHapp

Antwort

26

Ihr Routing ist nicht für diese Route eingerichtet. Vorausgesetzt, dass Sie die Standard-Gerüst verwenden, setzen Sie diese Zeile vor die map.resources :posts Zeile in config/routes.rb:

map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i 

Die Regex für :action es beschränkt auf az nur (zu vermeiden, Dinge zu kontrollieren, wie/posts/1). Es kann verbessert werden, wenn Sie Unterstriche oder Zahlen in Ihren neuen Aktionen benötigen.

45

Der Fehler, den Sie machen, ist eigentlich eine ziemlich häufige.

Grundsätzlich ordnet Rails URLs für Ihre Scaffolds automatisch zu. Wenn Sie also die Posts-Scaffolds erstellt haben, ordnet Rails die URL-Routen dafür zu. Ein solcher Weg ist die URL für die Anzeige eines einzelnen Beitrag:/Beiträge/(post_id)

Also, wenn Sie die Eingabe der URL/posts/Start Rails denkt Sie sagen: „Hey, gib mir die Post mit ID Rails beklagt sich, dass die show-Methode keinen Beitrag mit einer solchen ID finden kann

Ein schneller Weg, um dies zu beheben, ist sicherzustellen, dass Ihre config/routes.rb die Route für die Startaktion vor dem Scaffolding hat Routen:

# Route for start action 
map.connect '/posts/start', :controller => 'posts', :action => 'start' 
# Default mapping of routes for the scaffold 
map.resources :posts 

Wie auch immer, die Hoffnung, die

+1

Danke für die Erklärung, ich muss mehr auf Routen lesen. – Mark

+4

Ich denke, eines der Dinge, die am besten helfen, zu verstehen, wie Routen in RoR funktionieren, besteht darin, sich daran zu erinnern, dass sie von oben nach unten ausgewertet werden. Daher ist es in der Regel eine bewährte Methode, Ihre spezifischen Routen vor den allgemeinen (Catch-All) Routen zu haben. – David

+0

Ich habe die Übereinstimmung '/ pages/action',: controller => 'pages',: action => 'action' verwendet und es hat funktioniert. –

0

hilft ich foun. d die Lösung für mein Problem, in der routes.rb Datei, in

map.resource :post 

ich mit Sammlung Argumente hinzugefügt, so blieb es so aus:

map.resource :post, :collection => { :my_action => :get} 
+2

In Rails 3 fügt das "Collection" => {"my_action" =>: get} 'zu den GET-Parametern hinzu. – rxgx

1

Dies funktioniert:

map.resource :post, :collection => { :my_action => :get} 
+0

In Rails 3 fügt die Auflistungsoption '" collection "=> {" my_action "=>: get}' zu den GET-Parametern hinzu. – rxgx

8

Versuchen Sie dies, wenn Sie Schienen 3.0.3

in Ihrer Route verwenden.rb

resource :posts do 
    collection do 
    get 'start' 
    end 
end 

diese

2

Ich möchte helfen könnte sagen, manchmal Rails klebrig wird mit Routen-Caching, auch in der Entwicklung Umgebung.

Es kann helfen, starten Sie Ihren Rails-Server neu. Das hat bei mir öfter geklappt, als ich zählen kann, wenn ich diesen Fehler erhalte.

33

On Rails 4.x verwenden:

get '/posts/start', :controller => 'posts', :action => 'start' 

On Rails 3.x Verwendung:

match '/posts/start', :controller => 'posts', :action => 'start' 

statt

map.connect '/posts/start', :controller => 'posts', :action => 'start' 

es mein Problem gelöst.