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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

15720閲覧

Railsでのform_tag内のname属性とハッシュの関係について

tarotarosu

総合スコア114

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

3クリップ

投稿2017/01/25 05:59

###前提・実現したいこと
railsでのform_tag内のname属性と、それに応じて生成されるハッシュの関係がよくわかりません。

<form>内の要素をrailsのコントローラで受け取るという処理において、以下のようなコードが出てきました。

###入力フォーム

html

1<%= form_tag papers_path do %> 2 タイトル 3 <input type="text" name="paper[title]"> 4 内容 5 <textarea name="paper[content]"></textarea> 6 <input type="submit" value="投稿する"> 7<% end %>

入力側でこのようなコードを書いた際、コントローラ側ではname属性の値から、以下のようなハッシュを生成するとのことでした。

ruby

1{paper: {title: "入力した内容", content: "入力した内容"}}

ここでいまいちピンとこないのが、name属性です。
普通ハッシュの値を取得する際などは、paper[:title]などとして取得すると思うのですが、params[title]という書き方の理由がよくわかりません。
そしてそれがどうやって、{paper: {title: "入力した内容", content: "入力した内容"}}と結びつくのかがよく理解できていません。
おそらくRubyの根本的なところだとは思うのですが、ご回答をいただけると助かります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ここでいまいちピンとこないのが、name属性です。
普通ハッシュの値を取得する際などは、paper[:title]などとして取得すると思うのですが、params[title]という書き方の理由がよくわかりません。

えーと、このHTMLの例ではparams[title]では取得できないと思います。
paramsに格納されるハッシュの形がこうなっているわけですよね。

ruby

1{paper: {title: "入力した内容", content: "入力した内容"}}

これは、書き方が違うだけで、以下と同じ意味になります。

ruby

1{ 2 :paper => { 3 :title => "入力した内容", 4 :content => "入力した内容" 5 } 6}

そのため、:titleを取り出したいなら、
params[:paper][:title]で取得する事になります。

name属性とparamsの対応について

ルールをまとめましたので、ご確認ください。

基本ルール

name属性がそのままparamsのキー(シンボル)になる。

html

1<form ...> 2 <input type="text" name="text1" /> 3 <input type="submit" name="btnPost" value="投稿する"> 4</form>

これをPOSTすると、paramsの中身はこうなるというルールがあります。

ruby

1{ 2 :text1 => "入力された内容", 3 :btnPost => "投稿する" 4}

特別ルールその1

ハッシュになるパターン。
name属性に[]を含め、かつ[]の中が空でない場合。

html

1<form ...> 2 <input type="text" name="text[t1]" /> 3 <input type="text" name="text[t2]" /> 4 <input type="submit" name="btnPost" value="投稿する"> 5</form>

ruby

1{ 2 :text => { 3 :t1 => "入力された内容", 4 :t2 => "入力された内容", 5 } 6 :btnPost => "投稿する" 7}

特別ルールその2

配列になるパターン。
name属性に[]を含め、かつ[]の中を空にする。

html

1<form ...> 2 <input type="text" name="text[]" /> 3 <input type="text" name="text[]" /> 4 <input type="submit" name="btnPost" value="投稿する"> 5</form>

ruby

1{ 2 :text => [ 3 "入力された内容", 4 "入力された内容" 5 ] 6 :btnPost => "投稿する" 7}

投稿2017/01/25 07:01

編集2017/01/25 07:02
mingos

総合スコア4025

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

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

tarotarosu

2017/01/25 12:03

詳しい解説までつけていただいてありがとうございます。 特別ルールと考えて割り切るしかない感じですかね。 ありがとうございました。
guest

0

一言で言えば、「そういうもの」と割り切るしかありません。

<input>name="paper[title]"は、Ruby上のハッシュの参照とはまったく別物です。

投稿2017/01/25 06:26

maisumakun

総合スコア145121

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問