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.

È stato utile?

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}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top