36

私はRubyonRailsを初めて使用し、ブログチュートリアルを完了しました。

私は今、「開始」と呼ばれる追加のアクションをコントローラーに追加しようとしています。

def start
end

単純なhtmlのみを含むビューページ「app/views / posts/start.html.erb」を追加しました。

/ posts / startに移動すると、次のエラーが発生します。

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

エラーを理解しました。showアクションが実行されており、startは有効なIDではありません。開始アクションが実行されないのはなぜですか?MVCアーキテクチャまたは構成の一部が欠落していますか?

以下は私の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

はい、サーバーを再起動して、Mongrelとwebrickで試しました。

4

7 に答える 7

45

あなたが作っているエラーは実際にはかなり一般的なものです。

基本的に、RailsはスキャフォールドのURLを自動的にマップします。したがって、Postsスキャフォールドを作成すると、RailsはそのスキャフォールドのURLルートをマッピングします。そのようなルートの1つは、単一の投稿を表示するためのURLです。/posts/(post_id)

したがって、URL / posts / startを入力すると、Railsは「ねえ、ID =startの投稿を教えてください。showメソッドがそのようなIDの投稿を見つけることができないと文句を言います。

これを修正する簡単な方法の1つは、足場ルートの前にconfig/routes.rbに開始アクションのルートがあることを確認することです。

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

とにかく、それが役立つことを願っています。

于 2008-12-30T20:08:06.770 に答える
33

Rails 4.x の場合:

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

Rails 3.x では以下を使用します。

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

それ以外の

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

それは私の問題を解決しました。

于 2011-09-28T14:00:43.867 に答える
26

ルーティングがそのルートを許可するように設定されていません。デフォルトのスキャフォールディングを使用していると仮定して、config/routes.rbの行の前にこの行を配置します。map.resources :posts

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

の正規表現は、:actionそれをazだけに制限します(/ posts / 1のようなものをキャッチしないようにするため)。新しいアクションでアンダースコアまたは数字が必要な場合は、改善できます。

于 2008-12-30T20:06:27.273 に答える
8

Rails 3.0.3を使用している場合は、これを試してください

あなたのroute.rbで

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

これは役立つかもしれません

于 2010-12-29T07:21:40.033 に答える
2

言いたいのは、開発環境であっても、Rails がルート キャッシングに固執する場合があるということです。

Rails サーバーを再起動すると役立つ場合があります。これは、このエラーを受け取ったときに数え切れないほど何度も機能しました。

于 2011-08-09T22:27:13.320 に答える
1

これは機能します:

map.resource :post, :collection => { :my_action => :get}
于 2010-02-16T10:15:14.840 に答える
0

私は自分の問題の解決策をroutes.rbファイルで見つけました。

map.resource :post

コレクション引数で追加したので、このままでした:

map.resource :post, :collection => { :my_action => :get}
于 2009-07-22T03:09:55.257 に答える