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

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

ただいまの
回答率

90.51%

  • Ruby

    8957questions

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

  • Ruby on Rails 5

    2791questions

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 150

ZizyNonno

score 14

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

下がコードなのですが、

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control' %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Save changes", class: "btn btn-primary" %>
    <% end %>

    <div class="gravatar_edit">
      <%= gravatar_for @user %>
      <a href="http://gravatar.com/emails" target="_blank">change</a>
    </div>
  </div>
</div>

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/15 11:25

    ご回答ありがとうございます!何点かご質問させていただきます!

    >>指定したモデル
    指定したモデルというのが要領を得ていないです。このコードでいうと、どれが近しいものなのでしょうか?

    >>form_forについて
    「指定したモデルに応じて、Railsの標準的なルーティングで作ったコントローラーに適切な値を飛ばすフォームを自動生成する」というご説明がありました。僕自身のform_forのイメージはビューにブロック構文で@userで持ってきた要素を代入するというイメージでした。そういうわけで、コントローラーに値を飛ばすフォームというのが要領を得ません。

    そして、これは仮説なのですが、form_for(@user)で持ってきた@userレコードに対して、ユーザー側がname,email,password,password_confirmationに対して入力。その内容をform_forヘルパーが一括でデータベースに送信し、情報を保存する。といった流れを誘発するヘルパーだと推察したのですが、この解釈は大丈夫でしょうか?

    >>ブロック構文について
    『ビューで使うブロックは「繰り返し」以外に、「ブロックの中身でタグの内容を指定する」という動作がある』という話でした。
    「タグの内容を指定する」というのはどういう場合に有用なのでしょうか?自分でビューにブロック構文を使っていくにあたり、その辺りのイメージをつけたいというのが質問の意図です。
    ブロック構文は奥が深いということで、こればかりは試行回数を重ねていって腑に落ちていくしかないとも思っています。

    以上、長くなりましたが、お時間があればでよろしいので、ご教授願えれば幸いです。よろしくお願いいたします。

    キャンセル

  • 2018/08/15 11:31

    「指定したモデル」は、書いての通り、引数に渡した「@user」です。

    「コントローラーに飛ばす」ということの具体的な動作は、「formのactionを、新規作成/更新(IDを含む)に合わせて切り替える」ということです。

    キャンセル

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Ruby

    8957questions

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

  • Ruby on Rails 5

    2791questions