ぞえの技術めも

Ruby on Rails勉強中

【154日目】【1日20分のRailsチュートリアル】【第11章】マイクロポスト作成フォームを定義する

Ruby on Railsチュートリアル(第3版)

今日は「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

ホーム画面にアクセスしてみる。

おぉ、マイクロポスト投稿フォームができてる!

f:id:kt_zoe:20170621123854p:plain

空のまま「Post」をクリックしてエラーメッセージが出ることも確認。

f:id:kt_zoe:20170621123911p:plain

今日の学習時間は【35分】

次は「11.3.3 フィードの原型」から。