Ruby on Railsのチュートリアル6(formでつまづく)
Railsはformと戦って撃沈したので、いまから作ります。
少し意味を考えすぎずに進めよう……orz
form_forヘルパーで書いている部分をform_tagヘルパーで書き換えたかった
form_for
<%= form_for(:session, url: sessions_path) do |f| %>
formのデータを投げる先はsessions_pathの名前付きルートで指定されるアドレス&メソッド。
sessions_pathで指定されているアドレスは'/sessions',
メソッドはPOSTなので、form_tagでは、
form_tag
<%= form_tag('/sessions', :method => :post) %>
となるはず。
form_for
<%= f.label :email %>
<%= f.text_field :email %>
上のformの指定の部分でdo |f|と書いているのでf.とあるのは
paramsのハッシュの[:session]の要素の[:session]がまたハッシュで
この[:session]のハッシュの[:email]という要素に値を入れる、ということなのでしょうか。
form_tagヘルパーでformの属性を指定した場合は
text_field_tagを使うらしく、このtagで指定する場合、
<%= text_field_tag オブジェクト名, プロパティ名 %>
となっているので、session(オブジェクトとリソースの関係が正直あまりよくわかってないのだけれど(早く勉強しろ))のemailという属性の値(正直オブジェクトというよりセッションと言われると連想配列というイメージしかわかない……)を指定したい場合、
form_tag
<%= label_tag session[email] %>
<%= text_field_tag :session, :email %>
とすればよいかと思って、結局,newのビューを
<% provide(:title, "Sign in") %>
<h1>Sign in</h1>
<div class="row">
<div class="span6 offset3">
<%= form_tag('/sessions', :method => :post %>
<%= label_tag session[email] %>
<%= text_field_tag :session, :email %>
<%= label_tag session[password] %>
<%= password_field_tag :session, :password %>
<%= submit "Sign in", class: "btn btn-large btn-primary" %>
<% end %>
<p>New user? <%= link_to "Sign up now!", signup_path %></p>
</div>
</div>
と書いてみたのだけど、
Failure/Error: before { visit signin_path }
ActionView::Template::Error:
/Users/woshidan/projects/sample_app/app/views/sessions/new.html.erb:15: syntax error, unexpected keyword_end, expecting ')'
'; end
^
/Users/woshidan/projects/sample_app/app/views/sessions/new.html.erb:19: syntax error, unexpected keyword_ensure, expecting ')'
/Users/woshidan/projects/sample_app/app/views/sessions/new.html.erb:21: syntax error, unexpected keyword_end, expecting ')'
という感じでにっちもさっちもいかない。
この後にも多少いじってみたんだけど、
変数に値を設定しなければいけないんだけど、認証する処理を行うコントローラに値を設定する部分がよくわかってないことが原因のような。
コントローラに値を飛ばすにはどうしたらいいんだろう。
POSTで飛ばしたら、POSTというハッシュになっていたりしないのかな。
phpならそうなんだけどな……。
こういうときは、飛ばそう!
それにしても、
そもそもlabelとは何だ
という話になり、formはなんとなく知ってたからきちんと勉強したこと無かったんだということがわかりました。
ここを見て確認したことをメモ。
よくフォームを作成するときに、名前:テキストボックス
という風に項目の名前と入力欄を並べて配置するけれど、
この項目の名前と入力欄の対応をはっきりさせるためのタグがlabelということ。
対応させると何がよいか、というと、
項目名をクリックすることでそのフォームへフォーカスされるようになる、ということ。
例えば、
OK NG
このフォームでは下の段では
<input type="radio" id="ok" name="ok" /><label for="ok">OK</label>
というラジオボックスのidと同じ値を指定したfor属性のラベルでOKの文字をかこっているのでラジオボックスだけでなくて、OKの文字の方をクリックしてもラジオボックスにチェックはいる、というもの。
スマホとか小さい画面でクリックするのが難しい、という場合に周りの項目名などをクリックして入力できるようにすると便利だったり。
(でもそういう場合は、そもそも大きなボタンを作ったほうがよいような気が)
またoptgroup labelで選択肢をグループ化することができる。
ただ、これだとブラウザによってグループ化されているという旨の表示のされ方がかわるので、実際に使うにはよろしくないかも。