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

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

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

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

Ruby

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

Q&A

解決済

2回答

1841閲覧

【Rails】form_forとブロックを使用したフォームのビューについて

zyno

総合スコア41

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/08/15 01:32

編集2018/08/15 01:45

現在RailsTutorialの10章を行っていますが、題目の内容がわかりません。

下がコードなのですが、

ruby

1<div class="row"> 2 <div class="col-md-6 col-md-offset-3"> 3 <%= form_for(@user) do |f| %> 4 <%= render 'shared/error_messages' %> 5 6 <%= f.label :name %> 7 <%= f.text_field :name, class: 'form-control' %> 8 9 <%= f.label :email %> 10 <%= f.email_field :email, class: 'form-control' %> 11 12 <%= f.label :password %> 13 <%= f.password_field :password, class: 'form-control' %> 14 15 <%= f.label :password_confirmation, "Confirmation" %> 16 <%= f.password_field :password_confirmation, class: 'form-control' %> 17 18 <%= f.submit "Save changes", class: "btn btn-primary" %> 19 <% end %> 20 21 <div class="gravatar_edit"> 22 <%= gravatar_for @user %> 23 <a href="http://gravatar.com/emails" target="_blank">change</a> 24 </div> 25 </div> 26</div>

フォームというnameやemailなど1回表示すれば事足りる類のものに対して、for文のような繰り返しを意味するブロック構文を使う意味が分からないことや、そもそもフォームを入力するのに、データベースから持ってきた@userの情報はいらないと考えました。

form_forについても調べても要領を得ることができず、理解ができない状態です。

質問事項は以下です。
①フォームというnameやemailなど1回表示すれば事足りる類のものに対して、for文のような繰り返しを意味するブロック構文を使う意味が分からない
②フォームを入力するのに、データベースから持ってきた@userの情報はいらないのではないか
③form_forについても調べても要領を得ることができない

そして、こういう質問をしている以上、フォームやブロック構文についてよくわかってないのが現状だと思っています。質問事項が要領を得ない場合は、フォームとは?ブロック構文とは?なぜこのようなコードが書かれているのか?までご教授願えると幸いです!

お手数おかけしますが、以上、分かる方がいらっしゃいましたらご教授願えればと思います!

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

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

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

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

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

guest

回答2

0

説明の都合上、順番を変えて説明します。

③form_forについても調べても要領を得ることができない

form_forは、指定したモデルに応じて、Railsの標準的なルーティングで作ったコントローラーに適切な値を飛ばすフォームを自動生成するためのヘルパーです。新規作成用も編集用も共通のコードで運用できます。

  • 入力された値の再表示
  • フォームのnameactionの自動設定

などを行っています。これらを行うためには、モデルの値が必要です(②)。

①フォームというnameやemailなど1回表示すれば事足りる類のものに対して、for文のような繰り返しを意味するブロック構文を使う意味が分からない

ブロック構文は、必ずしも繰り返しを意味するものではありません。具体例としては、

  • File.openにブロックをつけると、「ファイルを開く」→「ブロック内を実行する」→「ファイルを閉じる」というように、自動でファイルを閉じてくれる
  • tryにブロックをつけると、「付けたものがnilでなければブロック内を実行し、値を返す」

そして、ビューで使うブロックは「繰り返し」以外に、「ブロックの中身でタグの内容を指定する」という動作になることもあります。

投稿2018/08/15 01:43

maisumakun

総合スコア145184

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

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

zyno

2018/08/15 02:25

ご回答ありがとうございます!何点かご質問させていただきます! >>指定したモデル 指定したモデルというのが要領を得ていないです。このコードでいうと、どれが近しいものなのでしょうか? >>form_forについて 「指定したモデルに応じて、Railsの標準的なルーティングで作ったコントローラーに適切な値を飛ばすフォームを自動生成する」というご説明がありました。僕自身のform_forのイメージはビューにブロック構文で@userで持ってきた要素を代入するというイメージでした。そういうわけで、コントローラーに値を飛ばすフォームというのが要領を得ません。 そして、これは仮説なのですが、form_for(@user)で持ってきた@userレコードに対して、ユーザー側がname,email,password,password_confirmationに対して入力。その内容をform_forヘルパーが一括でデータベースに送信し、情報を保存する。といった流れを誘発するヘルパーだと推察したのですが、この解釈は大丈夫でしょうか? >>ブロック構文について 『ビューで使うブロックは「繰り返し」以外に、「ブロックの中身でタグの内容を指定する」という動作がある』という話でした。 「タグの内容を指定する」というのはどういう場合に有用なのでしょうか?自分でビューにブロック構文を使っていくにあたり、その辺りのイメージをつけたいというのが質問の意図です。 ブロック構文は奥が深いということで、こればかりは試行回数を重ねていって腑に落ちていくしかないとも思っています。 以上、長くなりましたが、お時間があればでよろしいので、ご教授願えれば幸いです。よろしくお願いいたします。
maisumakun

2018/08/15 02:31

「指定したモデル」は、書いての通り、引数に渡した「@user」です。 「コントローラーに飛ばす」ということの具体的な動作は、「formのactionを、新規作成/更新(IDを含む)に合わせて切り替える」ということです。
guest

0

ベストアンサー

もう一人の方の回答と被ってしまっている部分もあるかもですが…

(1).

まず、forは必ずしも繰り返しを示す英単語ではありません。
確か中学英語では、forは ~のための、という和訳が充てられていたと思いますが、この場合はこちらの意味でしょう。
form_for @userは、@userを編集するためのFORMを生成する、程度の意味かと。

form_forがブロック構文を使う理由は、
最終的に生成されるHTMLにおいて、ブロックの内側に書いたヘルパーによって生成されるタグ(inputタグなど)が、FORMタグで囲まれる、というそれだけだと思います。

(2).

@user を渡す理由ですが、いくつかあります。

まず、FORMのACTIONを指定するためです。
polymorphic_url(@user)というメソッドにより、@user.new_record?であれば、PUT /users、@user.persisted?であれば、PATCH /users/1 がFORMのACTIONに書き込まれることになります。

上記からも分かるように、作成時と編集時も同じソースで生成できるようになっています。
その編集時に、DBの値をフィールドに表示するのにもつかわれています。

更に、上記と同じような仕組みによるものですが、
直前にユーザーが入れた、まだDBに保存されていない値を参照するためでもあります。
エラー等が起きて、同画面を再描画した際も、(コントローラーでユーザーが入力した値を@userに入れておくことで)直前にユーザーが入れた値が、再度フィールドに表示されます。

Scaffoldに従って作ったコントローラーの書き方であれば、その際、@userはエラー情報等も保持しているので、各カラムにおいてエラーがあった際、当該カラムを強調表示する、なんてこともできるようになっています。

(3).
チュートリアルで疑問が出た時は、
日本語のガイドもあるので、目を通すと理解が深まるかもしれません。

投稿2018/08/26 03:40

takumiabe

総合スコア661

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問