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

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

ただいまの
回答率

90.01%

rails form_with とhidden_field の意味

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 177

kotu_kotuo

score 8

前提・実現したいこと

ruby on rails でq&aシステムを作っています。
そこで教材に以下のコードが書いてあったのですが、解説が全くなくネットで調べてもよく分からなかったため質問します。

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

<%= form_with model: [@question,@answer],local: true do |f| %>
    <%= f.hidden_field :question_id, {value: @question.id} %> 
    <div class = "form-group">
      <label>Name</label>
      <%= f.text_field :name,class: "form-control" %>
    </div>
    <div class = "form-group">
      <label>Content</label>
      <%= f.text_area :content,class: "form-control" %>
    </div>
    <div class = "text-center">
      <%= f.submit "Post",class: "btn btn-primary" %>
    </div>
    <% end %>
 def show
    @answer =Answer.new
    @question = Question.find(params[:id])
  end
Prefix Verb   URI Pattern                                                                              Controller#Action
             answers_edit GET    /answers/edit(.:format)                                                                  answers#edit
                     root GET    /                                                                                        questions#index
         question_answers GET    /questions/:question_id/answers(.:format)                                                answers#index
                          POST   /questions/:question_id/answers(.:format)                                                answers#create
      new_question_answer GET    /questions/:question_id/answers/new(.:format)                                            answers#new
     edit_question_answer GET    /questions/:question_id/answers/:id/edit(.:format)                                       answers#edit
          question_answer GET    /questions/:question_id/answers/:id(.:format)                                            answers#show
                          PATCH  /questions/:question_id/answers/:id(.:format)                                            answers#update
                          PUT    /questions/:question_id/answers/:id(.:format)                                            answers#update
                          DELETE /questions/:question_id/answers/:id(.:format)                                            answers#destroy
                questions GET    /questions(.:format)                                                                     questions#index
                          POST   /questions(.:format)                                                                     questions#create
             new_question GET    /questions/new(.:format)                                                                 questions#new
            edit_question GET    /questions/:id/edit(.:format)                                                            questions#edit
                 question GET    /questions/:id(.:format)                                                                 questions#show
                          PATCH  /questions/:id(.:format)                                                                 questions#update
                          PUT    /questions/:id(.:format)                                                                 questions#update
                          DELETE /questions/:id(.:format)                                                                 questions#destroy
       rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
rails_blob_representation GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
       rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
     rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

分からないこと

・form_withのmodelを設定するとはどういう意味なのか
・modelが2つある場合と1つの場合はどう違うのか
・f.hidden_fieldはコントローラ側で@question_idを使用するために入れてあるらしいのですがよく分からない
・f.hidden_fieldには"名前"と"値"を設定すると知ったが、そのデータがどこから来てどこに送られてどのように使われるかが分からない

回答者様の貴重なお時間を頂戴して申し訳ございませんが、よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

・form_withにモデルを設定するということは、使用するモデルを元にしてデータを入力して、それがcreateアクションあるいはupdateアクションでバリデーションなどの処理がされてDBに保存するような感じなのですが、この回答で大丈夫でしょうか?
・form_withで設定しているモデルの引数が二つの場合は、主にネストしている場合です。configフォルダにあるroutes.rbを見ながら以下のURLを参考にすると分かると思います。おそらく、一つの質問のidに対して複数のanswerがあることを想定しているのだと思います。ネストしていない場合は、単純に一つのモデルで大丈夫です。
https://qiita.com/keisukegdk/items/beb5a62c17278c25c00d

・ユーザに見せない隠しデータとしてhidden_fieldを用いています。この場合、@question.idの値が:question_idのパラメータとして@answerに渡されています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/07/10 17:01

    ご回答ありがとうございます!
    残念ながらまだよく分からないのですが、
    form_withは、modelに設定したインスタンスの中身が空(new)だったらcreateアクションに、中身が既にあったらupdateアクションに、railsが自動で判断して送ってくれるということですか?

    キャンセル

  • 2019/07/10 18:33

    はい、その通りです。routes.rbに「resources」を使っている場合は、自動的に飛び先とparamsの名前空間(resources: <ここで指定した名前>)が設定されています。

    ただし、
    get 'login', to: 'sessions#new'
    のようにresourcesを使わずに手動で設定した場合に関してはresourcesの適用外なので、名前空間と飛び先を例えば以下のように設定する必要があります。
    form_for(:session(これが名前空間), url:login_path(これが飛び先) )

    なぜかというと、肝心のモデルがないためです。sessionはここではログイン機能という設定ですが、この場合モデルは必要ないので上記のように設定しなければならないです。

    ちなみに、form_withはrails5.2から実装された機能で、従来使われていたform_forによるモデルの紐付け機能とformタグの汎用性をまとめたものになっています。

    キャンセル

  • 2019/07/10 21:17

    いろいろ追加で教えてくださりありがとうございます🙇‍♂️
    研究とお仕事頑張ってください!

    キャンセル

  • 2019/07/11 00:13

    ありがとうございます。
    システム完成すると良いですね。

    キャンセル

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

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる