質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

3543閲覧

redirect_toでアクション指定をしてもエラーが表示される:No route matches {:action=>"show", :controller=>"top"}

yy0117

総合スコア6

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

0クリップ

投稿2018/05/09 02:44

前提・実現したいこと

「create」アクションで保存したデータを「show」アクションで表示したいです。

発生している問題・エラーメッセージ

「new」アクションで「form_for」を活用し「period」と「step」という二つのモデルにデータを作成し「create」アクションでデータを保存しました。
その後、同controller内の「show」アクションにredirectしたいのですが、エラーが発生します。

エラーメッセージ

ActionController::UrlGenerationError in TopController#create

No route matches {:action=>"show", :controller=>"top"}

Extracted source (around line #15):
13 @period = Period.create(period_params)
14 @step = Step.create(step_params)
15 redirect_to :action => "show" #ここが赤く表示されています
16
17 end
18 def show

該当のソースコード

ソースコード 【/app/controllers/top_controller.rb】 class TopController < ApplicationController def index end def new @period = Period.new @step = Step.new end def create @period = Period.create(period_params) @step = Step.create(step_params) redirect_to :action => "show" end def show @period = Period.find(params[:id]) @step = Step.find(params[:id]) end private def period_params params.require(:period).permit(:start_date) end def step_params params.require(:period).require(:step).permit(:stepname, :stepcount).merge(period_id: params[:period_id]) end end
ルート root GET    / top#index top_index GET /top(.:format) top#index POST      /top(.:format)   top#create new_top GET  /top/new(.:format) top#new edit_top GET /top/:id/edit(.:format) top#edit top GET    /top/:id(.:format) top#show PATCH      /top/:id(.:format) top#update PUT      /top/:id(.:format) top#update DELETE      /top/:id(.:format) top#destroy

試したこと

色々ググりましたが、どこに原因があるのかわからず質問をさせて頂きました。
まだRubyを初めて1ヶ月の初心者でして、とても初歩的な質問かもしれません。
恐縮ですが、何卒アドバイスをご教示いただけますと幸いです。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

そもそもですが、showアクションには, :idが必要なのでは?
:idなしでリダイレクトさせてますね。
ちなみにtop GET /top/:id(.:format) top#showは意味合いとしてはtopsテーブルの:idのレコードを表示という意味合いに取れてしまいますよ。そもそも、何を表示するshowページですか?

topコントローラーの意味がよくわからないのですが、そして、コントローラーで直接createしてる二つのモデルが気になります。どんな意味合いですか?

投稿2018/05/11 06:00

daikitakaya

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yy0117

2018/05/11 06:11

ご返答、ありがとうございました。 >ちなみにtop GET /top/:id(.:format) top#showは意味合いとしてはtopsテーブルの:idのレコードを表示という意味合いに取れてしまいますよ。そもそも、何を表示するshowページですか? 私の根本的な間違いで、「show」で「stepsテーブルのid」を取ってきて表示したかったのですが、「topsテーブル」のレコードから表示することになっていたのですね。。。。 periodコントローラとstepsコントローラを作成し、periodコントローラでのcreateアクションで「period_id」を持たせてstepコントローラに遷移するように書き換えて対応したいと思います。 ご返答を頂きましてありがとうございました。
daikitakaya

2018/05/11 06:15

> 私の根本的な間違いで、「show」で「stepsテーブルのid」を取ってきて表示したかったのですが、「topsテーブル」のレコードから表示することになっていたのですね。。。。 これは意味合い的な問題で実際にはそうなっていません。 例えば、/tops/1の時は def show @period = Period.find(params[:id]) @step = Step.find(params[:id]) end より,id = 1の@periodと@stepが取得されます。それをshowアクションに表示します。 しかし、redirect_to :action => "show"と書いただけでは、showアクションへリダイレクトという命令をしただけで/top/1の1の部分が抜けています。 @period = Period.find(params[:id]) @step = Step.find(params[:id]) の両方ともが、同じ:idで取得されてるのも気になります。
yy0117

2018/05/11 09:19

いろいろ調べて試した末、以下のように書き換え、「period_id」をstepコントローラに受け渡すことができました。 (stepコントローラでのcreateのあとは一旦rootで戻しました) ================================ class PeriodsController < ApplicationController def new @period = Period.new @step = @period.build_step(id: [:period_id]) end def create @period = Period.create(period_params) @step = @period.build_step(id: [:period_id]) redirect_to new_period_step_path(@step.period_id) end ================================ class StepsController < ApplicationController def new @period = Period.find(params[:period_id]) @step = Step.new end def create @step = Step.create(step_params) redirect_to :root end ================================
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問