私はRuby on Railsを初めて使用しました ブログチュートリアル を完了しました。
私はコントローラに「開始」と呼ばれる追加のアクションを追加しようとしています。
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で試してみました。
ルーティングがそのルートを許可するように設定されていません。デフォルトのスキャフォールディングを使用していると仮定して、この行をbefore config/routes.rbのmap.resources :posts
行に追加します。
map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i
:action
の正規表現は、それをa-zだけに制限します(/ posts/1のようなものをキャッチしないようにします)。新しいアクションでアンダースコアまたは数字が必要な場合は改善できます。
あなたがしているエラーは実際にはかなり一般的なものです。
基本的に、Railsは足場のURLを自動的にマッピングします。そのため、投稿の足場を作成したとき、RailsはそのURLルートをマッピングしています。そのようなルートの1つは単一の投稿を表示するためのURL:/ posts /(post_id)
したがって、/ posts/start Railsは、URLを入力しているときに、「ID = startの投稿を提供してください。だからRails = 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
とにかく、それが役立つことを願っています。
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'
それは私の問題を解決しました。
Rails 3.0.3を使用している場合は、これを試してください
あなたのroute.rbに
resource :posts do
collection do
get 'start'
end
end
これは役立つかもしれません
私は言いたいのですが、Railsは、development環境であっても、ルートキャッシングに固執します。
あなたのRails serverを再起動するのに役立つかもしれません。これは私がこれを受け取ったときに数えることができるよりも多くの時間私のために働きましたエラー。
これは機能します:
map.resource :post, :collection => { :my_action => :get}
私は私の問題の解決策をroutes.rbファイルで見つけました
map.resource :post
コレクション引数を追加したので、このままでした:
map.resource :post, :collection => { :my_action => :get}