koya-kudaka / sample_app

0 stars 0 forks source link

パーシャルを利用する際の、provideとyieldの関係がわけわからんくなった #14

Open koya-kudaka opened 3 years ago

koya-kudaka commented 3 years ago

演習の課題で起こったこと。

リスト 10.5のパーシャルを使って、new.html.erbビュー (リスト 10.6) とedit.html.erbビュー (リスト 10.7) をリファクタリングしてみましょう (コードの重複を取り除いてみましょう)。ヒント: 3.4.3で使ったprovideメソッドを使うと、重複を取り除けます3。(関連するリスト 7.27の演習課題を既に解いている場合、この演習課題をうまく解けない可能性があります。うまく解けない場合は、既存のコードのどこに差異があるのか考えながらこの課題に取り組んでみましょう。例えば筆者であれば、リスト 10.5で用いた変数を渡すテクニックを使って、リスト 10.6やリスト 10.7で必要になるURLをリスト 10.5に渡してみるでしょう。)

という問題。

koya-kudaka commented 3 years ago

まず、行うことを整理してみた。

・まず、何を言っているのか? user登録の新規登録と更新のフォームをnew.html.erbとedit.html.erbにそれぞれ書くのではなく、_form.html.erbというファイルを作って、パーシャル利用してフォームを作成しれ!ということ。

・_form.html.erbにフォームを書く ・new.html.erb, edit.html.erbの中にrenderを記述してパーシャル用のファイルを呼び出す。 ・フォームのPOSTリクエストをわけないといけないので、url でパスを指定してあげる。(ここがわけがわかってなかった)

koya-kudaka commented 3 years ago

こんな感じにしなければならないかな。

[app/views/users/_form.html.erb]

    <%= form_for(@user, url: yield(:url)) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control' %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class:'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit yield(:button_text), class: "btn btn-primary" %>
    <% end %>
koya-kudaka commented 3 years ago
[app/views/uesrs/new.html.erb]

<% provide(:title, "Sign up") %>
<% provide(:button, "Create my account") %>
<% provide(:url, users_path) %>
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render 'form' %>
  </div>
</div>
[app/views/users/edit.html.erb]

<% provide(:titl, "Edit user") %>
<% provide(:title, 'Save changes') %>
<% provide(:url, user_path) %>
<h1>Update your profile</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render 'form' %>
    <div class="gravatar_edit">
      <%= gravatar_for @user %>
      <a href="http://gravatar.com/emails" target="_blank" rel="noopener">changes</a>
    </div>
  </div>
</div>
koya-kudaka commented 3 years ago

provideで、リクエスト用のurlパスをform上に渡さなければならない。 form内では、yieldで受け取っている。

ここでわけわからなくなるのは、 ファイルにprovideしていると思ってしまうと「パーシャルのファイルなのにyieldで受け取っている!?」と勘違いする。 あくまでも、パーシャルされた後に、formがprovideされてるurlを受け取ったと考えるべき