36 votes

L'ajout d'une action d'un contrôleur existant (Ruby on Rails)

Je suis nouveau sur Ruby on Rails, j'ai terminé le Tutoriel du Blog.

Je suis maintenant essayer d'ajouter une action supplémentaire pour le contrôleur, appelé "start".

def start
end

J'ai ajouté une page d'affichage "app/views/posts/start.html.erb" contenant uniquement du html simple.

Quand je vais à /posts/début j'obtiens l'erreur suivante.

ActiveRecord::RecordNotFound in PostsController#show 
Couldn't find Post with ID=start

Je comprends l'erreur, la fin de l'action est en cours d'exécution et de démarrage n'est pas une pièce d'identité valide. Pourquoi ne pas le début d'action est exécutée, est-il une partie de l'architecture MVC ou de configuration, je suis absent ?

Ci-dessous mon 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

Oui, j'ai redémarré le serveur et il a essayé avec Mongrel et webrick.

45voto

David Points 2026

L'erreur que vous faites est en fait assez commun.

Fondamentalement, Rails de mappe automatiquement les Url de vos échafaudages. Ainsi, lorsque vous avez créé les Postes des échafaudages, des Rails est la cartographie de l'URL itinéraires pour elle. Un tel itinéraire est l'URL permettant d'afficher un seul post: /posts/(post_id)

Donc, quand vous êtes en entrant l'URL /posts/start Rails pense que vous êtes en train de dire "Hey, donnez-moi le post avec ID = start. Donc, les Rails se plaint de ce que la méthode show ne pouvez pas trouver un poste avec une telle identification.

Un moyen rapide de résoudre ce problème est de s'assurer que votre config/routes.rb a la route pour le début de l'action avant l'échafaudage itinéraires:

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

De toute façon, espérons que cette aide.

33voto

Nailson Landim Points 361

Sur Les Rails De 3.x utilisation:

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

au lieu de

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

il a résolu mon problème.

26voto

zenazn Points 8373

Votre de routage n'est pas configuré pour permettre à l'itinéraire. Si vous utilisez la valeur par défaut de l'échafaudage, mettre cette ligne avant de l' map.resources :posts ligne dans le fichier config/routes.rb:

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

La regex pour :action restreint à tout juste a-z (pour éviter d'attraper des choses comme /articles/1). Il peut être amélioré si vous avez besoin des traits de soulignement ou les numéros de vos nouvelles actions.

8voto

Amanuel Points 89

À essayer si vous êtes à l'aide de rails 3.0.3

dans votre itinéraire.rb

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

cela peut vous aider

2voto

ghayes Points 4661

Je veux dire que, parfois, les Rails se complique avec les routes de la mise en cache, même dans le développement de l'environnement.

Il peut aider à redémarrer votre serveur Rails. Ce qui a fonctionné pour moi plus de fois que je peux compter lors de la réception de cette erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X