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

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

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

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

Ruby

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

975閲覧

rails form_with とhidden_field の意味

kotu_kotuo

総合スコア14

Ruby on Rails 5

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

Ruby

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2019/07/08 06:13

前提・実現したいこと

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

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

ruby

1<%= form_with model: [@question,@answer],local: true do |f| %> 2 <%= f.hidden_field :question_id, {value: @question.id} %> 3 <div class = "form-group"> 4 <label>Name</label> 5 <%= f.text_field :name,class: "form-control" %> 6 </div> 7 <div class = "form-group"> 8 <label>Content</label> 9 <%= f.text_area :content,class: "form-control" %> 10 </div> 11 <div class = "text-center"> 12 <%= f.submit "Post",class: "btn btn-primary" %> 13 </div> 14 <% end %>

controller

1 def show 2 @answer =Answer.new 3 @question = Question.find(params[:id]) 4 end

routes

1Prefix Verb URI Pattern Controller#Action 2 answers_edit GET /answers/edit(.:format) answers#edit 3 root GET / questions#index 4 question_answers GET /questions/:question_id/answers(.:format) answers#index 5 POST /questions/:question_id/answers(.:format) answers#create 6 new_question_answer GET /questions/:question_id/answers/new(.:format) answers#new 7 edit_question_answer GET /questions/:question_id/answers/:id/edit(.:format) answers#edit 8 question_answer GET /questions/:question_id/answers/:id(.:format) answers#show 9 PATCH /questions/:question_id/answers/:id(.:format) answers#update 10 PUT /questions/:question_id/answers/:id(.:format) answers#update 11 DELETE /questions/:question_id/answers/:id(.:format) answers#destroy 12 questions GET /questions(.:format) questions#index 13 POST /questions(.:format) questions#create 14 new_question GET /questions/new(.:format) questions#new 15 edit_question GET /questions/:id/edit(.:format) questions#edit 16 question GET /questions/:id(.:format) questions#show 17 PATCH /questions/:id(.:format) questions#update 18 PUT /questions/:id(.:format) questions#update 19 DELETE /questions/:id(.:format) questions#destroy 20 rails_service_blob GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs#show 21rails_blob_representation GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show 22 rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show 23update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update 24 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には"名前"と"値"を設定すると知ったが、そのデータがどこから来てどこに送られてどのように使われるかが分からない

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

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

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

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

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

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

guest

回答1

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/08 07:14

bamboo-nova

総合スコア1408

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

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

kotu_kotuo

2019/07/10 08:01

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

2019/07/10 09: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タグの汎用性をまとめたものになっています。
kotu_kotuo

2019/07/10 12:17

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

2019/07/10 15:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問