🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

解決済

1回答

3782閲覧

Ruby on Rails コントローラー内でモデル.newを行われるのは何故か。 実際.newでどんな動きがなされているのか。何が行われているのか。allメソッドとform_withの確認。

nyako

総合スコア45

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/02/01 10:13

Rails / Ruby 初心者ですが、ずっとモヤモヤしているのでここで解決したいと強く思っています。
newがクラスメソッドだということは理解しています。またallであればテーブルから持ってきて、@tweetsのインスタンス変数に代入していることも理解出来ます。

ただ.Tweet.newのようにnewをしている意味がわかりません。

これはまずインスタンス化のnewと同じnewでしょうか。

rb

1 2 3## tweets_controller.rb (コントローラー) 4 5class TweetsController < ApplicationController 6 7 def index 8 @tweets = Tweet.all 9 end 10 11 def new 12 @tweet = Tweet.new //なんのためのnew13 end 14 15end 16 17

rb

1 2## tweet.rb (モデル) 3 4class Tweet < ApplicationRecord 5end 6

以前クラスとインスタンスを学習して理解したつもりでしたが、

まずTweet.allを細かく砕いて見てみると、allというメソッドがTweetに対して使えるのは
TweetクラスがApplicationRecordクラスを継承をしている為、ApplicationRecordクラス内にあるであろうallメソッドというクラスメソッドがあるので使えているのだと思っています。

またそのallメソッドはSQLを直接的に操作が出来て、DBから全てのレコード,カラムを持ってくるメソッドだと思っています。

ここまでは頭の中で理解できるのですが、
いざnewになった時になぜnewをしているのかわかりません。
勉強をしたときにインスタンスを生成してって言うのはわかったつもりでしたが、railsになると意味不明です。

今回やろうと思っている実装は新規でツイートを投稿ページを作成するためにnewを使うとカリキュラムに書いてあります。新規ページのフォームを作るからnewなんでしょうか。

ちなみにこのあと、投稿画面(new.html.erb)でform_withを使用するため、Tweetクラスをインスタンス生成しておきましょう。とありますが、form_withを使用するためのTweetクラスをインスタンス化しなければいけないのは何故かわかりません。

以上質問がまとまってなくて申し訳ないですが、よろしくお願い致します。

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

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

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

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

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

m.ts10806

2021/02/01 10:14

このコードだけでは何とも言えないのでは。 全体提示してください。
m.ts10806

2021/02/01 10:15

>これはまずインスタンス化のnewと同じnewでしょうか。 これには「はい」としかこたえようがないですね。 ドキュメントも確認してください。 https://railsdoc.com/model
nyako

2021/02/01 10:19

ありがとうございます。こうやってすぐにお返事をいただき本当に嬉しいです。 全体といってもファイル数が多いのですが、この質問に対しての他に見せるべきコードはどちらになりますでしょうか? 初心者であるので至らない点があったら申し訳ないです。
m.ts10806

2021/02/01 10:39

提示するのは「自身が書いたコード」です。
nyako

2021/02/01 11:09

上記も自身で書いたコードですよ。
guest

回答1

0

ベストアンサー

いざnewになった時になぜnewをしているのかわかりません。

フォームを表示するにあたって、フォームヘルパーを活用するにはインスタンスが必要になるので、とりあえずnewで空のインスタンスを用意しています。

form_withを使用するためのTweetクラスをインスタンス化しなければいけないのは何故かわかりません。

form_withは「データがある場合の再入力」も担っているので、編集時にはモデルインスタンスを渡すことになります。それと処理を合わせたほうが都合がいいので、新規作成時も空のモデルインスタンスを取るようになっています。

投稿2021/02/01 10:17

編集2021/02/01 10:19
maisumakun

総合スコア145967

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

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

maisumakun

2021/02/01 10:20

的を外しているかもしれませんので、疑問点があればお知らせください。
nyako

2021/02/01 11:25

ご丁寧にご回答ありがとうございます! 結果的にform_withで使用するためにnewというクラスメソッドを使用しているのですね。。着眼点がそこにはなかったです。 回答をいただいた後で、form_withについて色々調べましてその上で3点質問があります。 ① モデルインスタンスとはここでいうと Tweetモデルに書く、Tweetクラスのインスタンスでしょうか? ② 最初にform_withでは、最初にフォームを作成する際空のインスタンスを作成すると覚えればそれで解決かもしれませんが 空のインスタンス => 具体的に中に何が入っているのでしょうか。 ③ モデルのクラスのインスタンスを生成するということは、実際にあるテーブルと何かしら因果関係があるのでしょうか? form_withで使うからではなく、そもそも現在のTweetクラスから出来たインスタンスはあくまでそのTweetクラスに書いてあるクラスメソッドやインスタンスメソッド以外に何を持っていますか? 伝わるかどうか不安ですがよろしくお願い致します。
maisumakun

2021/02/01 11:37

> ① モデルインスタンスとはここでいうと Tweetモデルに書く、Tweetクラスのインスタンスでしょうか? そのとおりです。 > ② 空のインスタンス => 具体的に中に何が入っているのでしょうか。 各フィールドはデータベースの初期値やnilなどで埋められています。 > ③ モデルのクラスのインスタンスを生成するということは、実際にあるテーブルと何かしら因果関係があるのでしょうか? はい、テーブルから引いてきたモデルインスタンスと同じ属性(カラム名を使って代入できるなど)を持っています。
nyako

2021/02/05 09:30

ご回答ありがとうございす。また気になることがあれば一旦調べてまた質問させていただきます。わかりやすくご親切にしていただき本当に感謝しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問