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

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

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

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

Q&A

解決済

1回答

2027閲覧

フォームにhidden_field_tagでデータを引っ張ってmust existになる

takeke

総合スコア60

Ruby

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

0グッド

1クリップ

投稿2018/04/27 04:40

タイトル通りなのですが、フォームに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

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

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

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

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

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

guest

回答1

0

自己解決

自己解決できました!ご覧いただいた方、考えていただけた方ありがとうございましたm(._.)m以下修正箇所載せます

①フォームのhidden_field →<%= f.hidden_field :user_id, value: current_user.id %>
②order.rbのvalidatesにuser_id追加
③orders_controller.rbのcreateに、@order = params[:order].permit(:name, :address, :email, :pay_type)←permitに:user_id追加。同create内の@userの定義はcurrent_user使うだけだったので不要でした。後々@userを定義する必要があれば書きます。

よくよく考えてみると記述の隅々まで読んで意味を考えればすぐ解決できたような気がします。今回はコントローラー内のpermitを見落としていたのと、hidden_fieldの書き方が問題でした。

以上でやりたかったことができました!またこれからカートの情報も取り入れたいので行き詰まったら質問するかもです。ありがとうございましたm(._.)m

投稿2018/04/27 07:37

takeke

総合スコア60

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問