質問

Ruby on Railsは初めてで、ブログチュートリアルを完了しました。

>

コントローラに「開始」というアクションを追加しようとしています。

def start
end

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

/ 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で試しました。

役に立ちましたか?

解決

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

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

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

他のヒント

発生しているエラーは実際にはかなり一般的なものです。

基本的に、Railsは足場のURLを自動的にマッピングします。そのため、Posts scaffoldを作成すると、RailsはそのURLルートをマッピングします。そのようなルートの1つは、単一の投稿を表示するためのURLです:/ posts /(post_id)

だから、URLを入力しているとき/ posts / start Railsはあなたが言っていると思う&quot;ねえ、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

とにかく、それが役に立てば幸いです。

On Rails 4.xの使用:

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

On Rails 3.xの使用:

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

の代わりに

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

問題を解決しました。

レール3.0.3を使用している場合はこれを試してください

route.rb内

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

これが役立つ場合があります

言いたいのですが、開発環境でも、Railsはルートキャッシングにこだわる場合があります。

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

これは動作します:

map.resource :post, :collection => { :my_action => :get}

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

map.resource :post

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

map.resource :post, :collection => { :my_action => :get}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top