タイトル通りなのですが、フォームにhidden_field_tagでデータをあらかじめ出してからsubmitボタンを押すとそこの項目がmust existになってしまいます。
hidden_field_tag自体の書き方も色々試したのですが、ruby自体のエラーになるのでフォームのmust existが出るほうが近いと思うのでそれで質問させていただきます。
まずフォームです
<%= form_for(@order) do |f| %> <% if @order.errors.any? %> <div id="error_explanation" > <h2><%= pluralize(@order.errors.count, "error") %> prohibited this order from being saved:</h2> <ul> <% @order.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div> <%= f.label :名前 %><br> <%= f.text_field :name, size: 42 %> </div> <div> <%= f.label :住所 %><br> <%= f.text_area :address, rows: 3, cols: 40 %> </div> <div> <%= f.label :Eメール %><br> <%= f.email_field :email, size: 42 %> </div> <div> <%= f.label :支払い方法 %><br> <%= f.select :pay_type, Order::PAYMENT_TYPES, prompt: 'お支払い方法を選択してください' %> </div> <%= hidden_field_tag (:user), @user %> <div> <%= f.submit '注文する' %> </div> <% end %>
order.rb
class Order < ApplicationRecord PAYMENT_TYPES = ["現金","クレジットカード","注文書"] has_many :line_items, dependent: :destroy belongs_to :user validates :name, :address, :email, presence: true validates :pay_type, inclusion: PAYMENT_TYPES default_scope -> { order(created_at: :desc) } def add_line_items_from_cart(cart) cart.line_items.each do |item| item.cart_id = nil line_items << item end end end
user.rb
class User < ApplicationRecord validates :email,presence: true validates :name, presence: true, uniqueness: true has_secure_password after_destroy :ensure_an_admin_remains has_many :products has_many :orders end
orders_controller.rb
class OrdersController < ApplicationController skip_before_action :authorize, only: [:new, :create] before_action :authenticate def new @cart = current_cart if @cart.line_items.empty? redirect_to store_url, notice: "カートは空です" return end @order = Order.new respond_to do |format| format.html format.json { render json: @order } end end def create # @order = Order.new(params[:order]) @order = params[:order].permit(:name, :address, :email, :pay_type) @example = Order.new(@order) @example.add_line_items_from_cart(current_cart) @user = current_user respond_to do |format| if @example.save Cart.destroy(session[:cart_id]) session[:cart_id] = nil OrderNotifierMailer.received(@example).deliver # binding.pry format.html {redirect_to store_url, notice: 'ご注文ありがとうございます^^'} format.json { render json: @order, status: :created, location: @order} else @cart = current_cart format.html {render action: "new"} @order = @example format.json {render json: @order.errors, status: :unprocessable_entity} end end end
schema.rb
create_table "orders", force: :cascade do |t| t.string "name" t.text "address" t.string "email" t.string "pay_type" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "user_id" t.integer "product_id" t.integer "quantity" end
これは、ecサイトのオーダーフォームなのですが、やりたいことはこのフォームをcurrent_userが特定できるようにして、後からこのオーダーの情報をオーダー側とユーザー側からも見れるようにしたいです。本当はここにカートの情報とかも載せたいのですが、まづはこの問題を解決させられたら他の参考になると思うので質問させていただきました。
hidden_fidld_tagの他に普通にf.text_fieldとかもやって直接書いていく方法も試したのですがうまく行かず、belongs_to :userを外してもmust existがblank userとかになるだけでした。何かお気付きの方いらっしゃいましたらよろしくお願いいたしますm(._.)m
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。