【154日目】【1日20分のRailsチュートリアル】【第11章】マイクロポスト作成フォームを定義する
今日は「11.3.2 マイクロポストを作成する」のマイクロポスト作成フォームを定義するところから。
11.3.2 マイクロポストを作成する
次はマイクロポスト作成フォームを定義します (リスト11.37)。
これもファイルから作成します。
$ touch app/views/shared/_micropost_form.html.erb
できたファイルを下記内容で更新。マイクロポストを入力してPOSTで送信するフォームを定義。
app/views/shared/_micropost_form.html.erb
<%= form_for(@micropost) do |f| %> <%= render 'shared/error_messages', object: f.object %> <div class="field"> <%= f.text_area :content, placeholder: "Compose new micropost..." %> </div> <%= f.submit "Post", class: "btn btn-primary" %> <% end %>
1つは、(以前と同様) 関連付けを使用して次のように@micropostを定義することです。
homeアクションにマイクロポストのインスタンス変数を追加。
app/controllers/static_pages_controller.rb
def home @micropost = current_user.microposts.build if logged_in? end
リスト11.37を動かすためのもう1つの変更は、エラーメッセージのパーシャルを再定義することです。
(中略)
object: f.objectはerror_messagesパーシャルの中でobjectという変数名を作成してくれるので、この変数を使ってエラーメッセージを更新すればよいということです (リスト11.39)。
うーん、なんか難しい…。
error_messagesパーシャルを汎用的に使えるようにするためのあれこれってことだよね…。
@user
としてたところをobject
に変更。
app/views/shared/_error_messages.html.erb
<% if object.errors.any? %> <div id="error_explanation"> <div class="alert alert-danger"> The form contains <%= pluralize(object.errors.count, "error") %>. </div> <ul> <% object.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %>
この時点でテストを走らせてみてください。テストが失敗したままになっています。
$ bundle exec rake test ERROR["test_password_resets", PasswordResetsTest, 2017-06-08 11:12:25 +0000] : 57 tests, 286 assertions, 0 failures, 1 errors, 0 skips
失敗しますね。
このパーシャルは他の場所でも使われていたため、ユーザー登録 (リスト7.18)、パスワード再設定 (リスト10.50)、そしてユーザー編集 (リスト9.2) のそれぞれのビューを更新する必要があったのです。
パスワード再設定のやつしかログには出てないけど、いいのかな。
app/views/password_resets/edit.html.erb
: <%= render 'shared/error_messages', object: f.object %> :
試しにパスワード再設定だけ直してテスト実施してみる。
$ bundle exec rake test 57 tests, 294 assertions, 0 failures, 0 errors, 0 skips
…通っちゃったよ!!何故だ……
ユーザー登録のソースコード見てみると、「9.6 演習」のnewフォームとeditフォームをパーシャル化するの対応がmasterに入っちゃってるっぽい。
あれー、演習の内容マージしたっけな…。エラー出てないしこっちは直さなくてもいいのかな。
パーシャルの方でobject: @user
って指定してるから問題ないのかも。でも一応f.object
に統一しておくか。
app/views/users/_form.html.erb
: <%= render 'shared/error_messages', object: f.object %> :
修正してもテストが通ることを確認。
$ bundle exec rake test 57 tests, 294 assertions, 0 failures, 0 errors, 0 skips
さらに、この章で作成したすべてのHTMLが適切に表示されるようになったはずです。
動作確認してみましょう。
サーバーを起動して
$ rails server -b $IP -p $PORT
ホーム画面にアクセスしてみる。
おぉ、マイクロポスト投稿フォームができてる!
空のまま「Post」をクリックしてエラーメッセージが出ることも確認。
今日の学習時間は【35分】。
次は「11.3.3 フィードの原型」から。