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

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

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

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

Q&A

解決済

1回答

550閲覧

choicekadaiテーブルのidを引き渡したい

atsdknbs

総合スコア1

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/09 09:34

編集2020/09/09 17:12

前提・実現したいこと

choicekadaiテーブルのidを引き渡す

choiceテーブルとchoicekadaiテーブルがあり、choiceテーブルの値はきちんと送れているのですが、
choicekadaiテーブルの値が送れません。
何故でしょうか。そもそもchoiceテーブルはどこかで指定しているわけではないのですがidが自動で送られています。
なのに、choicekadaiテーブルのidが送られないのは何故でしょうか。
初心者です。よろしくお願いします。

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

エラーメッセージ

Couldn't find Choicekadai with 'id'={:id=>nil}

該当のソースコード

ソースコード

<choiceomote.html.erb>

<div class="field"> <% @choicekadai.each do |choicekadai| %> <% @atr = choicekadai.shutudai %> <%= @kadai_id = choicekadai.id %> <%= @str = @atr.delete("[").delete("]").delete('""').split(',') %> <%= @ar = @str[0].to_i %> <%= link_to(choicekadai.kadai,"/choices/#{choicekadai.id}/choice/#{@ar}",{kadai_id: @kadai_id}) %> <% end %> </div>

<choices_controller.html.erb>
def show
@choicekadai = Choicekadai.find(id: params[:kadai_id])
@choice = Choice.find_by(id: params[:id])
@random = []
@random = [["choice_one",@choice.one],["choice_two",@choice.two],["choice_three",@choice.three],["choice_four",@choice.four]]
@random.shuffle!
end

<追記>
基本情報の過去問道場のようなサイトを作成したいと考えています。
choiceテーブル(問題テーブル)
id|title|created_at|updated_at|setumon|one|two|three|four|kaisetu|hint|chapter|
title:タイトル
setumon:問い
one,two,three,four:選択肢4つ
kaisetu:解説
hint:ヒント
chapter:問題の内容によってchapterわけしてます

choicekadaiテーブル(課題テーブル)
id|kadai|created_at|updated_at|shutudai|kigen|
kadai:課題のタイトル("課題(forループ)"など)
shutudai: 例:["37", " 42", " 50", " 47", " 40", " 36", " 51", " 39", " 48", " 43"]
kigen:期限

shutudaiには、choicekadaiのidを配列にして、10個いれています。
想像としましては、"課題(forループ)"をクリックしたら、配列の一つ目の問題が表示され、そのあと残りの9問を解いて終了。
shutudaiの配列をループで一つずつ取り出し、取り出した値をchoiceのidで一致するものを問題として出題し、解いたら、次の問題、という感じをイメージしています。
そのために、choicekadaiのidを引っ張ってこないといけないんですが、うまく行きません。

<routes.rb>
Rails.application.routes.draw do
get "choices/:id/choice" => "choices#choice"
get "choices/choiceomote" => "choices#choiceomote"
get "choices/index" => "choices#index"
get "choices/new" => "choices#new"
get "choices/:id/choice/:id" => "choices#show"
get "choices/show" => "choices#show"
post "choices/create" => "choices#create"
post "choices/check_box" => "choices#check_box"
get "choices/:id/edit" => "choices#edit"
post "choices/:id/update" => "choices#update"
post "choices/:id/choice/:id/show" => "choices#show"
post "choices/:id/choice/:id/response_params" => "choices#response_params"
post "choices/:id/destroy" => "choices#destroy"
post "choices/:id/date" => "choices#date"
post "choices/:id/choice/:id/next" => "choices#next"
end

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず
Choicekadai.find(id: params[:kadai_id])の構文が間違っています。

Choicekadai.find(params[:kadai_id])
もしくは
Choicekadai.find_by(id: params[:kadai_id])
に変えてください。

あとはparams[:kadai_id]が取れていないためnilになっているのですが、これはroutes.rbを見ないと修正できません。

色々と情報不足のため、routes.rbと各モデルの情報を追記してみてください。

追記

get "choices/:id/choice" => "choices#choice"
例えばこのURLの場合、choices#choiceアクションではparams[:id]でURLの:id部分を取得することができます。

get "choices/:id/choice/:id" => "choices#show"
こちらのchoices#showアクションの場合、:idが2つあるため2つを分けて取得することができません。
こういう時は
get "choices/:kadai_id/choice/:id" => "choices#show"
のように:idの部分を分けて記述をします。

1個目の:idを:kadai_idに変更すると、
取りたかったChoicekadai.find_by(id: params[:kadai_id])が取れるのではないでしょうか

また、routesがご自身でおっしゃるとおりRailsらしくはありません。

Railsのルーティング
こちらを参考にCRUDベースで作ることを勉強すると良くなると思います。

投稿2020/09/09 09:56

編集2020/09/10 10:08
necocoa

総合スコア209

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

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

atsdknbs

2020/09/09 10:35

回答ありがとうございます。 構文の件、承知しました。変えました。 routes.rbの該当部分なども追記しましたので、またアドバイスをいただけたら、と思います。
necocoa

2020/09/09 11:12

追記ありがとうございます。やりたいことが理解できました。 routes.rbのコードをそのままコピペで貼り付けてもらっていいですか?
atsdknbs

2020/09/09 17:17

ありがとうございます。 routes.rb追記していたつもりでした。今貼り付けました。 progateなどから最初は作っていたんですが、routes.rbも自分でいろいろいじって ぐちゃぐちゃですよね、すみません。
necocoa

2020/09/10 10:08

追記にて修正点を記載させていただきました。 ご確認お願いします!
atsdknbs

2020/09/10 12:55

やりたかったことできました! 本当に回答ありがとうございます。 routesもすぐ勉強します!助かりました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問