Aggiunta di un'azione a un controller esistente (Ruby on Rails)
-
03-07-2019 - |
Domanda
Sono nuovo di Ruby on Rails, ho completato il Blog Tutorial .
Ora sto provando ad aggiungere un'azione aggiuntiva al controller, chiamata 'start'.
def start
end
Ho aggiunto una pagina di visualizzazione " app / views / posts / start.html.erb " contenente nient'altro che semplice html.
Quando vado in / posts / start ottengo il seguente errore.
ActiveRecord::RecordNotFound in PostsController#show
Couldn't find Post with ID=start
Capisco l'errore, l'azione show è in esecuzione e start non è un ID valido. Perché l'azione di avvio non viene eseguita, c'è qualche parte dell'architettura MVC o della configurazione che mi manca?
Di seguito è il mio 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
Sì, ho riavviato il server e l'ho provato con Mongrel e Webrick.
Soluzione
Il tuo percorso non è impostato per consentire tale percorso. Supponendo che tu stia utilizzando l'impalcatura predefinita, metti questa riga prima la map.resources: posts
linea in config / route.rb:
map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i
La regex per : action
lo limita a solo a-z (per evitare di catturare cose come / posts / 1). Può essere migliorato se hai bisogno di sottolineature o numeri nelle tue nuove azioni.
Altri suggerimenti
L'errore che stai commettendo è in realtà piuttosto comune.
Fondamentalmente, Rails mappa automaticamente gli URL per i tuoi scaffold. Quindi, quando hai creato gli scaffold Posts, Rails sta mappando i percorsi URL per esso. Uno di questi percorsi è l'URL per la visualizzazione di un singolo post: / posts / (post_id)
Quindi, quando inserisci l'URL / post / inizio Rails pensa che stai dicendo " Ehi, dammi il post con ID = inizio. Quindi Rails si lamenta che il metodo show non riesce a trovare un post con tale ID.
Un modo rapido per risolvere questo problema è assicurarsi che config / route.rb abbia il percorso per l'azione di avvio prima dei percorsi di ponteggio:
# Route for start action
map.connect '/posts/start', :controller => 'posts', :action => 'start'
# Default mapping of routes for the scaffold
map.resources :posts
Comunque, spero che sia d'aiuto.
Su Rails 4.x utilizzare:
get '/posts/start', :controller => 'posts', :action => 'start'
Su Rails 3.x utilizzare:
match '/posts/start', :controller => 'posts', :action => 'start'
anziché
map.connect '/posts/start', :controller => 'posts', :action => 'start'
ha risolto il mio problema.
Prova questo se stai usando le rotaie 3.0.3
nel tuo route.rb
resource :posts do
collection do
get 'start'
end
end
questo potrebbe aiutare
Voglio dire, a volte Rails diventa appiccicoso con route-caching, anche nell'ambiente sviluppo .
Potrebbe essere utile riavviare il server Rails . Questo ha funzionato per me più volte di quanto possa contare quando si riceve questo errore.
Funziona:
map.resource :post, :collection => { :my_action => :get}
Ho trovato la soluzione al mio problema, nel file route.rb dove
map.resource :post
Ho aggiunto con l'argomento collection, quindi è rimasto così:
map.resource :post, :collection => { :my_action => :get}