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

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

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

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

Q&A

解決済

2回答

1448閲覧

html.erbの中のURL内の.idが必要な理由がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

0グッド

0クリップ

投稿2018/10/23 08:05

※ルーティング内

rails

1get "users/:id/edit" => "users#edit"

※コントローラー内

rails

1 def edit 2 @user = User.find_by(id: params[:id]) 3 end

※edit.html.erb内

rails

1 <%= form_tag("/users/#{@user.id}/update") do %>

質問が3つあります。
1.コントローラー内の@userにはidのみが代入されているのでしょうか?
2.コントローラー内のUserはどこのUserを指定しているのでしょうか?(多分このコードの中にはないですが、言葉で説明できるようなことだったら教えて欲しいです。)
3.仮にコントローラー内の@userにidが代入されているのだとすれば、edit.html.erb内のURLに#{@user.id}のidが入る理由がわからないです。

私は、ルーティング→コントローラー→edit.html.erbの順番で書いています。書き方がおかしいので、3のような疑問が出て来るのでしょうか?

部分回答でも構いませんので、お分かりの方、教えて下さい。

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

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

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

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

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

guest

回答2

0

ベストアンサー

maisumakun さんの回答で間違いないのですが
それぞれ何をしているのか考えれば理解も深まるかと

ruby

1# routes.rb 2get "users/:id/edit" => "users#edit"

ここのURL中の:idとは:idというキーワードで参照できるオールマイティーな箱みたいなものです。
なんでも入ります。params[:id]で現在のURLの:idに該当する値が取れます。基本的には数字が入るので

ruby

1# controller.rb 2def edit 3 @user = User.find_by(id: params[:id]) 4end

と書くことでUserテーブルの中からidparams[:id]と同じユーザーを探すことができます。
そのユーザーの情報が@userに格納されているわけです。

html

1<%= form_tag("/users/#{@user.id}/update") do %>

ここでの@user.idは最初に述べた:idという箱に入る値になります。
@userのままではユーザー情報が丸々入ってしまいます。
基本的にはユーザーIDの数値だけが欲しいので
@user.idとすることでユーザー情報のIDの値のみを入れているわけです。

送信した後はまた最初と同じですね。

投稿2018/10/23 08:33

編集2018/10/23 08:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/10/23 08:47

コントローラー内の@userの中にはidに適ったユーザー情報が入っているので、HTML内のURLでコードを書くときはその情報の中でもidだよ。と指定してるわけですね! めちゃくちゃわかりやすかったです! buta_bottiさんありがとうございました!
退会済みユーザー

退会済みユーザー

2018/10/23 08:55

初心者だとよくわからないですよね、いきなり出てくるparamsもなんだ?って感じだし :idも文字そのものが入っているのかなって混乱したり インスタンスっていう表現もわかりにくかったり... 僕も通った道なのでわかります。頑張ってください。
退会済みユーザー

退会済みユーザー

2018/11/14 08:33

ごめんなさい。こんな優しい言葉かけてくれたのに、返信があったことに今気付きました。 今まさに混乱の最中です。プログラミングの学習サイトをやってるだけなのに。。。 このままwebサービスを自作できるのか、不安ですが、このままモチベーションを維持しつつゆっくり頑張りたいです。
guest

0

1.コントローラー内の@userにはidのみが代入されているのでしょうか?

いえ、User.find_byで返ってくるのはUserのインスタンスです。

2.コントローラー内のUserはどこのUserを指定しているのでしょうか?

id: params[:id]ということで、URLに入ってきたidのユーザーです。

3.仮にコントローラー内の@userにidが代入されているのだとすれば

前提が誤りです。

投稿2018/10/23 08:08

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2018/10/23 08:42

maisumakunさん、お早い回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問