iwhg0211
@iwhg0211 (h i)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

投稿したデータがviewに反映されない

投稿したデータがviewに反映されない

例)
Ruby on RailsでECサイトをつくっています。
その中で注文した商品の配送先を登録するページの作成中に不備が発生しました。
解決方法を教えて下さい。

発生している問題

エラーは出ていませんが、登録した配送先の住所、郵便番号、宛名がindexページに表示されません。

下記コントローラー

class Public::AddressesController < ApplicationController

  def index
    @addresses = Address.all
    @address = Address.new
  end

  def create
    address = Address.new(address_params)
    address.save
    redirect_to addresses_path

  end
 、
 、
 、
  private

  def address_params
    params.require(:address).permit(:name, :postal_code, :address)
  end

end

下記indexのview

<h1>配送先登録/一覧</h1>

<%= form_with model: @address, url: addresses_path do |f| %>

<p>郵便番号(ハイフンなし)</p>
<%= f.text_field :postal_code %>

<p>住所</p>
<%= f.text_field :address %>

<p>宛名</p>
<%= f.text_field :name %>

<%= f.submit '新規登録' %>

<% end %>

<table>
  <thead>
    <tr>
      <th>郵便番号</th>
      <th>住所</th>
      <th>宛名</th>
      <th></th>
    </tr>
  </thead>
  <% @addresses.each do |address| %>
  <tbody>
    <td><%= address.postal_code %></td>
    <td><%= address.address %></td>
    <td><%= address.name %></td>
    <td><%= link_to '編集する', edit_address_path %><%= link_to '削除する', address_path, method: :delete, data: { confirm: "本当に削除しますか" } %></td>
  </tbody>
  <% end %>
</table>

自分で試したこと

tbody.../tbodyの子要素のところにtrが抜けていたので、それを足したり、@addresses.each do |address|を=@addresses.each do |address|にしてeachが表示されるか試してみたりしましたが、表示されませんでした。

質問経験が少なく、わかりづらい質問かもしれませんが、詳しい方、ご教授いただければ幸いです。

0

5Answer

Comments

  1. @iwhg0211

    Questioner

    ご返信いただきありがとうございます。
    ```
    def create
    @address = Address.new(address_params)
    @address.save!
    redirect_to addresses_path
    end
    ```
    ですると、ActiveRecord::RecordInvalid inが起きてしまいました・・・
  2. そのエラー内容を見たら何か分かるんじゃないでしょうか

    エラー詳細が表示されていませんでしたか?

もしかしたらroute.rbがpostではなくてgetになっているってことはないでしょうか。。。

1Like

Comments

  1. @iwhg0211

    Questioner

    ご返信いただきありがとうございます!

    addresses GET /addresses(.:format) public/addresses#index
    POST /addresses(.:format) public/addresses#create
    edit_address GET /addresses/:id/edit(.:format) public/addresses#edit
    address PATCH /addresses/:id(.:format) public/addresses#update
    PUT /addresses/:id(.:format) public/addresses#update
    DELETE /addresses/:id(.:format) public/addresses#destroy

    一応rails.routesで確認したところ、POSTになっているのでその線はないのかと思います・・・
    申し訳ないです・・・
  2. <%= form_with model: @address, url: addresses_path do |f| %>
    上記のurlのaddresses_pathがあっていますでしょうか?
    <%= form_with model: @address do |f| %>
    一度urlを削除して試してみてください。
    おそらく上記だと入力フォームの値がaddresses_pathに渡っていると思います。

ご返信いただきありがとうございます!

コンソールで試してみました!

[1] pry(main)> @genres = Genre.all
   (0.7ms)  SELECT sqlite_version(*)
  Genre Load (0.1ms)  SELECT "genres".* FROM "genres"
=> [#<Genre:0x00007f2036c8db08 id: 1, name: "test1", created_at: Wed, 28 Sep 2022 07:05:20.432652000 UTC +00:00, updated_at: Fri, 30 Sep 2022 00:59:51.415406000 UTC +00:00>,
 #<Genre:0x00007f2035a50878 id: 2, name: "test2", created_at: Wed, 28 Sep 2022 07:07:09.126731000 UTC +00:00, updated_at: Fri, 30 Sep 2022 00:59:56.933140000 UTC +00:00>,
 #<Genre:0x00007f2035a507b0 id: 3, name: "test3", created_at: Wed, 28 Sep 2022 07:07:30.639121000 UTC +00:00, updated_at: Fri, 30 Sep 2022 01:00:00.659203000 UTC +00:00>,
 #<Genre:0x00007f2035a506e8 id: 4, name: "test4", created_at: Wed, 28 Sep 2022 07:08:54.328478000 UTC +00:00, updated_at: Fri, 30 Sep 2022 01:00:08.315323000 UTC +00:00>,
 #<Genre:0x00007f2035a50620 id: 5, name: "test5", created_at: Wed, 28 Sep 2022 10:55:28.559802000 UTC +00:00, updated_at: Fri, 30 Sep 2022 01:00:13.755594000 UTC +00:00>]
[2] pry(main)> @addresses = Address.all
  Address Load (0.2ms)  SELECT "addresses".* FROM "addresses"
=> []

[1]は、viewで表示がうまくいっている別のアクションです。[2]は今回ご相談させていただいた、viewで表示されないアクションです。
[1]は情報を取得できていますが、[2]は何も情報を受け取れていませんでした!
[2]で情報を受け取るためにすべき記述は何になりますでしょうか。

0Like

ありがとうございます。
このようにcontrollerを変えました。

  def create
    @address = Address.new(address_params)
    @address.save
    redirect_to addresses_path
  end

試してみましたが、うまく表示されませんでした。

[1] pry(main)> @addresses = Address.all
   (0.5ms)  SELECT sqlite_version(*)
  Address Load (0.1ms)  SELECT "addresses".* FROM "addresses"
=> []

お早く返信をいただいたのに申し訳ないです・・・

0Like

解決しました!
仕事で忙しく、返信をくださった方に返せていなくて申し訳ございませんでした。
皆様ご協力いただきありがとうございました!

      <% elsif !customer_signed_in? %> 
      <li>
        <%= link_to 'マイページ', root_path %>
      </li>
      <li>
        <%= link_to '商品一覧', items_path %>
      </li>
      <li>
        <%= link_to 'カート', cart_items_path %>
      </li>
      <li>
        <%= link_to 'ログアウト', destroy_customer_session_path, method: :delete%>
      </li>
      <% else %>
      <li>
        <%= link_to 'About', about_path %>
      </li>
      <li>
        <%= link_to '商品一覧', items_path %>
      </li>
      <li>
        <%= link_to '新規登録', new_customer_registration_path %>
      </li>
      <li>
        <%= link_to 'ログイン', new_customer_session_path %>
      </li>
      <% end %>
    </header>

で上記の1行目を!customerにしてたのでcustomerでログインしていなかったらマイページなどの画面が表示されるようになっていました・・・なのでログインできているふうに見えて、実はログインできていなかったのです・・・

上記を治した後、customer.modelで

  def active_for_authentication?
    super && (is_deleted == false)
  end

としていてis_deletedがfalseならカスタマー情報を保存できるよとしていました。それに対し、ターミナルを確認すると、is_deletedはnilだったので、ログインはできてもそのcustomerの情報は保存できずでした。

Addressはcustomerと紐づいていましたので、「customerがないとaddressの情報を保存できない」ということが今回の「配送先が保存できない」ということの原因でした。

0Like

Your answer might help someone💌