web-dev-qa-db-ja.com

既存のコントローラーへのアクションの追加(Ruby on Rails)

私は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で試してみました。

36
Mark

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

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

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

26
zenazn

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

基本的に、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

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

45
David

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'

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

33
Nailson Landim

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

あなたのroute.rbに

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

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

8
Amanuel

私は言いたいのですが、Railsは、development環境であっても、ルートキャッシングに固執します。

あなたのRails serverを再起動するのに役立つかもしれません。これは私がこれを受け取ったときに数えることができるよりも多くの時間私のために働きましたエラー。

2
ghayes

これは機能します:

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

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

map.resource :post

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

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