前提・実現したいこと
購入機能を実現したいのですが、
フォームに入力した内容が反映されず、全部フォームを埋めてもバリデーションで弾かれてしまいます
一つのビューで複数のテーブルを更新ということをtrade_address.rbでやろうとしてます
発生している問題・エラーメッセージ
エラーメッセージは無く、投稿した内容が反映されて無い状態です
該当のソースコード
routes.rb
ruby
1 resources :drinks, only: [:index,:new,:show,:create,:destroy] do 2 resources :trades,only: [:index,:new,:create] 3 end 4 post '/drinks/:id/trades/new', to: 'trades#create'
drinks/show.html.erb
erb
1 <%= link_to "商品を購入する", drink_trades_path(@drink) %>
このパスの指定はあってると思います
trades/index.erb
erb
1<%= form_with model: @order,url: drink_trades_path,method: :post, local: true do |f|%> 2 <%= render 'shared/error_messages',object: f.object%> 3 <p>苗字</p> 4 <%= f.text_field :fam_name %> 5 <p>名前</p> 6 <%= f.text_field :first_name %> 7 <p>苗字カナ</p> 8 <%= f.text_field :fam_name_kana %> 9 <p>名前カナ</p> 10 <%= f.text_field :first_name_kana %> 11 <p>誕生日</p> 12 <%= raw sprintf( 13 f.date_select( 14 :birthday, 15 class:'select-birth', 16 id:"birth-date", 17 use_month_numbers: true, 18 prompt:'--', 19 start_year: 1930, 20 end_year: (Time.now.year - 5), 21 date_separator: '%s'), 22 "<p> 年 </p>", "<p> 月 </p>") + "<p> 日 </p>" %> 23 <p>郵便番号</p> 24 <%= f.text_field :postal_code %> 25 <p>都道府県</p> 26 <%= f.collection_select(:prefecture_id, Prefecture.all, :id, :name, {}, {class:"select-box", id:"prefecture"}) %> 27 <p>市</p> 28 <%= f.text_field :city %> 29 <p>番地</p> 30 <%= f.text_field :house_num %> 31 <p>建物名</p> 32 <%= f.text_field :building_name%> 33 <p>電話番号</p> 34 <%= f.text_field :phone_num%> 35 <p>登録</p> 36 <%= f.submit "確定"%> 37<% end%> 38
trades_controller.rb
ruby
1class TradesController < ApplicationController 2 include SessionsHelper 3 def index 4 # 商品を表示 5 6 @item = Drink.find(params[:drink_id]) 7 @order = TradeAddress.new 8 #redirect_to root_path if @drink.trade 9 end 10 11 def new 12 13 @item = Drink.find(params[:drink_id]) 14 @order = TradeAddress.new 15 # 商品購入ページ 16 end 17 18 def create 19 20 @item = Drink.find(params[:drink_id]) 21 @order = TradeAddress.new(trade_params) 22 binding.pry 23 if @order.valid? 24 @order.save 25 redirect_to root_path 26 else 27 render 'index' 28 end 29 end 30 31 private 32 def trade_params 33 params.permit(:item_id,:user_id,:fam_name,:first_name,:fam_name_kana,:first_name_kana,:birthday, :postal_code, :prefecture_id, :city, :house_num, :building_name, :phone_num, :trade_id).merge(user_id: current_user.id,price: @item.price) 34 end 35end
trade_address.rb
ruby
1class TradeAddress 2 include ActiveModel::Model 3 # form_withやrender等の色々な機能が使える 4 attr_accessor :fam_name,:first_name,:fam_name_kana,:first_name_kana,:birthday,:postal_code, :city, :house_num, :building_name, :phone_num, :drink_id, :prefecture_id,:trade_id, :user_id, :price 5 6 with_options presence: true do 7 8 with_options format: { with: /\A[ぁ-んァ-ン一-龥]/, message: 'は全角で入力してください。' } do 9 validates :fam_name 10 validates :first_name 11 end 12 13 with_options format: { with: /\A[ァ-ヶー-]+\z/, message: 'は全角カタカナで入力して下さい。' } do 14 validates :fam_name_kana 15 validates :first_name_kana 16 end 17 18 validates :birthday 19 validates :postal_code,format: {with: /\A\d{3}[-]\d{4}\z/} 20 validates :prefecture_id, numericality: { other_than: 1 } 21 validates :city 22 validates :house_num 23 validates :phone_num 24 validates :trade_id 25 end 26 27 28 def save 29 trade = Trade.create(user_id: user_id, drink_id: drikn_id) 30 Address.create(fam_name: fam_name,first_name: first_name,fam_name_kana: fam_name_kana,postal_code: postal_code, prefecture_id: prefecture_id, city: city, house_num: house_num, building_name: building_name, phone_num: phone_num, trade_id: trade.id) 31 end 32end 33
各モデルのアソシエーション
user.rb
ruby
1 has_many :drinks, dependent: :delete_all 2 has_many :trades
drink.rb
ruby
1 belongs_to :user 2 has_one :trade
trade.rb
ruby
1 belongs_to :user 2 belongs_to :drink
address.rb
ruby
1 belongs_to :trade
マイグレーションファイル
202001293_create_address.rb
1class CreateAddresses < ActiveRecord::Migration[6.0] 2 def change 3 create_table :addresses do |t| 4 t.string :fam_name ,null: false 5 t.string :first_name ,null: false 6 t.string :fam_name_kana ,null: false 7 t.string :first_name_kana ,null: false 8 t.date :birthday ,null: false 9 t.string :postal_code ,null: false 10 t.integer :prefecture_id ,null: false 11 t.string :city ,null: false 12 t.string :house_num ,null: false 13 t.string :building_name ,null: false 14 t.string :phone_num ,null: false 15 t.references :trade ,null: false,foreign_key: true 16 t.timestamps 17 end 18 end 19end
create_trade.rb
ruby
1class CreateTrades < ActiveRecord::Migration[6.0] 2 def change 3 create_table :trades do |t| 4 t.references :user, foreign_key: true 5 t.references :drink,foreign_key: true 6 t.timestamps 7 end 8 end 9end
試したこと
From: /Users/soichirohara/coffee_passport/app/controllers/trades_controller.rb:22 TradesController#create: 18: def create 19: 20: @item = Drink.find(params[:drink_id]) 21: @order = TradeAddress.new(trade_params) => 22: binding.pry 23: if @order.valid? 24: @order.save 25: redirect_to root_path 26: else 27: render 'index' 28: end 29: end [1] pry(#<TradesController>)> @order => #<TradeAddress:0x00007fb81f1652b8 @price=3000, @user_id=6> [2] pry(#<TradesController>)> @item => #<Drink:0x00007fb81f1578e8 id: 1, name: "aaaa", price: 3000, explain: "aaaa", user_id: 6, created_at: Mon, 30 Nov 2020 08:29:00 UTC +00:00, updated_at: Mon, 30 Nov 2020 08:29:00 UTC +00:00>
このように入力した情報が反映されて無い状態が確認できました
[1] pry(#<TradesController>)> params => <ActionController::Parameters {"authenticity_token"=>"dD3/gLc7zNCF6f5s2Rj1VrjpSO27R5QReDwAstYFUc5h833ALZNUxw1a8N8d2kfTBeJ4JyhdXY/QedgPgXyqcg==", "trade_address"=>{"fam_name"=>"原", "first_name"=>"ソウ", "fam_name_kana"=>"", "first_name_kana"=>"", "birthday(1i)"=>"", "birthday(2i)"=>"", "birthday(3i)"=>"", "postal_code"=>"", "prefecture_id"=>"1", "city"=>"", "house_num"=>"", "building_name"=>"", "phone_num"=>""}, "commit"=>"確定", "controller"=>"trades", "action"=>"create", "drink_id"=>"1"} permitted: false> [2] pry(#<TradesController>)> ```試しに,fam_name,first_nameに当たる部分を入力して送信したら、パラメーターの中にはあるようです、、。 パラメーターの情報を上手く取得できないです ストロングパラメーターで格納したい情報が書き切れて無いのでしょうか、、、。 もしくは格納したい情報に不備があるのか、、、。 ネットで調べた事によると, belongs_toの後にoptional: trueをつけて、外部キーの空のカラムを許容するとのことですが、これは購入機能の場合大丈夫なんでしょうか、、、 回答をいただければ幸いです、、、 ### 補足情報(FW/ツールのバージョンなど) ruby 2.6系 rails 6.0.0 vscode
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/04 04:39
2020/12/04 16:39