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

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

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

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

Ruby on Rails

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

HTML

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

Q&A

解決済

2回答

1757閲覧

form_forがどのようにしてcontrollerを選択しているのか分からない

taishiaaaaa

総合スコア30

Ruby

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

Ruby on Rails

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

HTML

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

1グッド

0クリップ

投稿2018/11/22 10:07

RailsTutorialさんより下の画像に載っているコードの仕組みが分かりません。
_follow.html.erbのform_forはどのようにしてRelationshipsコントローラーにPOSTリクエストを送ればよいと判断しているのですか?
「コントローラーの指定がない場合、扱っているデータのモデル名の複数形のコントローラーに送る」のような暗黙の了解が裏にあるのでしょうか?
なぜform_forはPOSTリクエストを送るべき場所がRelationshipsコントローラーのcreateアクションだと判別できるのか教えてください。
回答お待ちしております。
railstutorial
tutorial

ki_ki_ton👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

form_forは引数にレコードを渡すと、そのレコードが新規作成のものか、既存のレコードかによって転送先を自動で推測してくれます。
例えば以下のようなコードは

<%= form_for(Post.new) do |f| %> ... <% end %>

以下のコードと一緒の意味を持ちます。

<%= form_for @post, as: :post, url: posts_path, html: { class: "new_post", id: "new_post" } do |f| %> ... <% end %>

対応するRESTfulなルーティングの設定をしている(つまりroutes.rbでresources :postsと定義している)場合は、上記のコードで postメソッドで/postsにルーティングしてくれる、つまりposts_controller.rbのcreateアクションが実行されることになります。

Railsチュートリアルの場合、/users/_follow.html.erbで、form_forの引数に新規作成したレコードを渡しているように見受けられますので、
createアクションが実行されるようにルーティングしてくれるのだと思います。

参考リンク

投稿2018/11/22 12:35

編集2018/11/22 12:42
troch

総合スコア349

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

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

taishiaaaaa

2018/11/24 12:44 編集

やはりPostモデルとpostsコントローラーの関連性がわからないです。Post.newという情報からurl: posts_pathが出てくるのは、やはり名称から判断しているのですか?
troch

2018/11/24 13:17

そうですね…その辺りを掴むには幾つか周辺知識が必要になると思います。 まずRailsは設定より規約(CoC)という思想を掲げています。 Railsが予め決めたルールに則ってコードを書くことで、開発者が逐一さまざまな設定をしたりコードを書いたりしなくて済みますよ、という考え方です。 命名規則とかもそうで、Railsの慣習に従うことで色々な恩恵が受けられます。 次にRESTという設計様式があります。 HTTPメソッドとURLを組み合わせることで、あるデータモデルのデータ取得・作成・更新・削除(CRUD)を出来るようにする、というものだと思います。 CRUD操作は殆どすべてのアプリケーションで必要とされる機能だと思います。 そのため、インターネットを経由して利用されるWebアプリケーションでは、 URLとHTTPメソッドを使ってアプリケーションのCRUD操作を呼び出すという RESTに則ったルート設計(RESTful なインターフェース)にすることはとても大切なことだと思います。 RailsではRESTfulなルート設計を簡単に出来るようにするために、resourcesメソッドというものが用意されています。 使い方も簡単で、config/routes.rbで resources :name と書きます。 :nameの箇所にはCRUD操作したいテーブル名を指定します。例えばUserモデルを元に構成されたデータ群であれば:usersを指定します。 (Userモデルに対応して生成されたデータベースのテーブル名がusersとなるのはRailsの命名規則です) resourcesメソッドを使うと、RESTfulなルーティングを一括で作成してくれます。 合計で7つのルーティングが自動生成され、:nameと同じ名前のコントローラへと対応付けてくれます。 参考:https://railsguides.jp/routing.html#crud%E3%80%81%E5%8B%95%E8%A9%9E%E3%80%81%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3 例えば resources :users と設定した場合、/users というURLにPOSTメソッドでアクセスすると、usersコントローラのcreateアクションにルーティングされます(この辺りもRailsの命名規則による仕様です)。 そしてusersコントローラのcreateアクションでは、Userモデルのデータを作成するメソッドが実行されることが期待される、というわけです。 Railsではリソースベースのルーティングが推奨されます。 form_forのように自動で転送先を推測してくれる系のメソッドも、 こうした規約を踏襲していると思います。 そのため <%= form_for(Post.new) do |f| %> のように引数に新規作成されたモデルのインスタンスが渡されると、 createアクション(データの作成用のメソッド)に向けてルーティングしてくれるのだと思います。
troch

2018/11/24 13:18

モデルとコントローラの関係も、Railsの規約に基づいて考えていくと理解しやすいと思います。 (長文失礼しました;)
taishiaaaaa

2018/11/24 14:27

「:nameの箇所にはCRUD操作したいテーブル名を指定します」 あれは単に名前を決定していたのではなくテーブル名を指していたのですね!何度も読んで理解していたつもりだったresourcesの意味が改めて理解できました。Userモデルとは違うテーブルの操作をusersコントローラーで動作させようと考えていてつまづいていたところでした。丁寧な回答ありがとうございました、また分からなくなったら見返したいと思います。
guest

0

form_forの内部では、モデルから必要なURLを読み取っています。具体的には、polymorphic_pathというヘルパーを使って、モデルのクラスからそれに対応するURLを生成しています(ソース)。

投稿2018/11/22 12:27

maisumakun

総合スコア145123

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

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

taishiaaaaa

2018/11/24 14:23

回答ありがとうございます。もっと体系的な知識をつけたタイミングでもう一度読んで理解に努めたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問