既存のコントローラーへのアクションの追加(Ruby on Rails)
-
03-07-2019 - |
質問
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}