質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

1251閲覧

エラーハンドリング時のリダイレクトで情報を保持したままにしたい。

Solt24times

総合スコア32

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/12/23 13:09

編集2021/12/28 09:55

前提・実現したいこと

現在、フリマアプリの購入機能の部分を作成中です。
購入の際に送付先の住所を入力するのですがバリデーションによる入力エラーを起こしたときに住所の部分をそのままにリダイレクトしたいのです。

発生している問題・エラーメッセージ

バリデーションおよびリダイレクトはしっかりと機能していますが情報は保持されず住所の部分は空欄になった状態に戻ってしまいいます。

エラーメッセージ

該当のソースコード

order/index.html.erb

ruby

1<%= render "shared/second-header"%> 2 3<div class='transaction-contents'> 4 <div class='transaction-main'> 5 <h1 class='transaction-title-text'> 6 購入内容の確認 7 8 【長いので一部省略】 9 10 <%# 配送先の入力 %> 11 <div class='shipping-address-form'> 12 <h1 class='info-input-haedline'> 13 配送先入力 14 </h1> 15 <div class="form-group"> 16 <div class='form-text-wrap'> 17 <label class="form-text">郵便番号</label> 18 <span class="indispensable">必須</span> 19 </div> 20 <%= f.text_field :postal_code, class:"input-default", id:"postal-code", placeholder:"例)123-4567", maxlength:"8" %> 21 </div> 22 <div class="form-group"> 23 <div class='form-text-wrap'> 24 <label class="form-text">都道府県</label> 25 <span class="indispensable">必須</span> 26 </div> 27 <%= f.collection_select(:prefectures_id, Prefectures.all, :id, :name, {}, {class:"select-box", id:"prefecture"}) %> 28 </div> 29 <div class="form-group"> 30 <div class='form-text-wrap'> 31 <label class="form-text">市区町村</label> 32 <span class="indispensable">必須</span> 33 </div> 34 <%= f.text_field :municipality, class:"input-default", id:"city", placeholder:"例)横浜市緑区"%> 35 </div> 36 <div class="form-group"> 37 <div class='form-text-wrap'> 38 <label class="form-text">番地</label> 39 <span class="indispensable">必須</span> 40 </div> 41 <%= f.text_field :address, class:"input-default", id:"addresses", placeholder:"例)青山1-1-1"%> 42 </div> 43 <div class="form-group"> 44 <div class='form-text-wrap'> 45 <label class="form-text">建物名</label> 46 <span class="form-any">任意</span> 47 </div> 48 <%= f.text_field :building, class:"input-default", id:"building", placeholder:"例)柳ビル103"%> 49 </div> 50 <div class="form-group"> 51 <div class='form-text-wrap'> 52 <label class="form-text">電話番号</label> 53 <span class="indispensable">必須</span> 54 </div> 55 <%= f.text_field :phone_number, class:"input-default", id:"phone-number", placeholder:"例)09012345678",maxlength:"11"%> 56 </div> 57 </div> 58 <%# /配送先の入力 %> 59 <div class='buy-btn'> 60 <%= f.submit "購入" ,class:"buy-red-btn", id:"button" %> 61 </div> 62 <% end %> 63 </div> 64</div> 65<%= render "shared/second-footer"%>

orders_contller.rb

Ruby

1class OrdersController < ApplicationController 2 before_action :authenticate_user! 3 4 def index 5 @item = Item.find(params[:item_id]) 6 @order = Order.new(order_params) 7 8 if @item.order.present? || @item.user_id == current_user.id 9 redirect_to root_path 10 end 11 12 end 13 14 def create 15 @item = Item.find(params[:item_id]) 16 @order_address = OrderAddress.new(order_params) 17 if @order_address.valid? 18 pay_item 19 @order_address.save 20 redirect_to root_path 21 else 22 render :index 23 end 24 end 25 26 private 27 28 def order_params 29 params.permit(:postal_code, :prefectures_id,:municipality, :address, :building, :phone_number, :item_id).merge(user_id: current_user.id, token: params[:token]) 30 end 31 32 def pay_item 33 Payjp.api_key = ENV["PAYJP_SECRET_KEY"] 34 Payjp::Charge.create( 35 amount: @item.price, 36 card: order_params[:token], 37 currency: 'jpy' 38 ) 39 end 40 41end 42

order.rb

class Order < ApplicationRecord belongs_to :user belongs_to :item has_one :address attr_accessor :token end

order_address.rb

ruby

1class OrderAddress 2 include ActiveModel::Model 3 attr_accessor :postal_code, :prefectures_id, :municipality, :address, :building, :phone_number, :user_id, :item_id, :token 4 5 with_options presence: true do 6 validates :user_id 7 validates :item_id 8 validates :postal_code, format: {with: /\A[0-9]{3}-[0-9]{4}\z/ } 9 validates :municipality 10 validates :address 11 validates :phone_number, format: {with: /\A[0-9]{10,11}\z/ } 12 validates :token 13 end 14 15 validates :prefectures_id, numericality: {other_than: 0, message: "can't be blank"} 16 17 def save 18 order = Order.create(user_id: user_id, item_id: item_id) 19 Address.create(postal_code: postal_code, prefectures_id: prefectures_id,municipality: municipality, address: address, building: building, phone_number: phone_number, order_id: order.id) 20 end 21 22end

試したこと

renderメソッドを使用すればいいと聞いていましたので使用したのですがダメでした。
それ以外で色々と調べてみたのですが解決につながりそうな情報を得ることができませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasaSakano

2021/12/24 15:28

「入力エラー」とは、Railsレベルで何を意味するのかわかりません。「カード情報以外の情報」もRailsレベルで何を意味するのか不明です。 具体的な情報が記載されていないと、回答を期待するのは難しいかと恐れます……。 一方、添付されたコードが長過ぎて読む気が萎えます。質問する前に、徹底的に絞って、必要部分だけを記載するのが望ましいです。端的には、回答者の手間を最小限に抑えるように努力すれば、回答がつく確率があがると思います。
MasaSakano

2021/12/28 13:37

編集されて少しわかりやすくなりました! しかし、依然、質問者の意図として、どのviewを見た時に、どのControllerメソッドが実行された結果として、「バリデーションによる入力エラー」が発生するのかがわかりません。この質問を読む人が、質問者の環境および実行状況を一切知らない、という前提で質問が書かれていないと、回答者がそれを憶測するのは難しいでしょう。
guest

回答1

0

自己解決

まだ理解でききれていませんが解決はしました。

<%= form_with id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %> <%= render 'shared/error_messages', model: @order_address %>

これを

<%= form_with model: @order_address, url: item_orders_path, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %> <%= render 'shared/error_messages', model: f.object %>

に変更することでrender_toが機能するようになりましたのでおそらくモデルの指定がなかった為、リダイレクトする内容が定義されていなかったのではないかと考えています。

投稿2022/01/23 07:00

Solt24times

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問