前提・実現したいこと
現在、フリマアプリの購入機能の部分を作成中です。
購入の際に送付先の住所を入力するのですがバリデーションによる入力エラーを起こしたときに住所の部分をそのままにリダイレクトしたいのです。
発生している問題・エラーメッセージ
バリデーションおよびリダイレクトはしっかりと機能していますが情報は保持されず住所の部分は空欄になった状態に戻ってしまいいます。
エラーメッセージ
該当のソースコード
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー