プログラミング初心者です
railsの基礎勉強が終わったので、このコロナのご時世にあやかって、
簡単な受発注システムをrailsで試しに作ってみようと思い、自分なりにモデルなどの構造を考え現在以下のような構想で作業を進めております。
①まずはproductテーブルに商品情報を登録しました。
②次に、order(s)テーブル・モデル・コントローラーを作成
③order(s)にCRUDの仕組み+selectというアクション、viewにも(order.)select.html.erbを作成しました
④まずはselectで商品を選んでもらい、その情報をもって(order.)new.html.erbにリダイレクトした後、数量や納期などを指定(入力)してもらい、オーダーテーブルにデータとして保存する。
それで、今④の途中でつまずきました。
productテーブルの情報をselect actionで@product.allを定義し、(order.)select.html.erbにeach文でループで表示しています。
それに加え、各行にラジオボタンを追加し、それを選択すると、その行ごとデータを取得できる仕組みをjqueryで作りました。
発生している問題・エラーメッセージ
そこまではうまくいっておりますが、そのあと、submitボタンを押し、(order.)new.html.erbにredirectすると、どの行を選択しても、productテーブルの一番最後のデータが(order.)new.html.erb反映されます。
redirectする前は、確かに選んだ行を取得しているようなのです。
(⇒(order.)select.html.erb画面で選択すると、その値がページ最下部にテスト用に入れたhtmlにしっかりと反映されています)
なぜredirectすると一番最後の行の値が入るのでしょうか?
原因と解決方法を教えていただけないでしょうか。
該当のソースコード
[routing] Rails.application.routes.draw do root "top#index" get "orders/select" => "orders#select" post "orders/select" => "orders#select" post "orders/new" => "orders#new" resources :products resources :orders end
[Orders.controlle.rb] class OrdersController < ApplicationController def index @orders = Order.all end def select @products = Product.all end def new @name = params[:name] @quantity_per_catron = params[:quantity_per_catron] end
[(orders.)select.html.erb] <% @page_title = "製品マスタ" %> <h2><%= @page_title %></h2> <%= link_to "製品マスタの新規登録", :new_product %> <table> <thead> <tr> <th></th> <th>製品名</th> <th>入目(kg)</th> <th>パッケージ</th> <th>原産地(kg)</th> <th></th> </tr> </thead> <tbody> <%= form_tag orders_new_path do %> <% @products.each do |product| %> <tr> <td><input type="checkbox" class="selectBtn"></td> <td><input type="text" name="name" value="<%= product.name %>"></td> <td><input type="text" name="quantity_per_catron" value="<%= product.quantity_per_catron %>"></td> <td><input type="text" value="<%= product.package %>"></td> <td><input type="text" value="<%= product.origin %>"></td> </tr> <% end %> <%= submit_tag %> <% end %> </tbody> </table> --ここからテスト用-- <span>name1: </span><span id="productsname1"></span> <span>name2: </span><span id="productsname2"></span>
[(orders.)new.html.erb] <div class="toolbar"><%= link_to "オーダー選択に戻る", :orders_select, data: {"turbolinks" => false} %></div> <%= form_with model: @order, url: orders_path, method: :post do |f| %> <table> <tr> <th>製品</th> <th>入目(kg)</th> </tr> <tr> <td><input type="text" name="name" value="<%= @name %>"></td> <td><input type="integer" name="quantity_per_catron" value="<%= @quantity_per_catron %>"></td> </tr> </table> <div><%= f.submit %></div> <% end %>
[application.js] jQuery(function($){ $(".selectBtn").on("click", function(){ var name1 = $(this).closest('tr').find('input[name=name]').val(); $("#productsname1").text(name1); var name2 = $(this).closest('tr').find('input[name=quantity_per_catron]').val(); $("#productsname2").text(name2); }); });
試したこと
new actionでwhereでnameをparamsで取得すれば、選択した行を取得できるかと思いましたがうまくいきませんでした。
(例)
def new
@product = Product.where(name: params[:name])
@product.name = params[:name]
@product.quantity_per_catron = params[:quantity_per_catron]
end
補足情報(FW/ツールのバージョンなど)
↓のやり方で結局うまくいきませんでした。
もしかしたら、new.html.erbが間違っているのでしょうか?
最初質問した際に、記載していたコードが間違っておりました、
実際は↓のように記載しています。
@product.nameとしていたところが、実際は@name
@product.quantity_per_catronとしていたところが、実際は@quantity_per_catron
です。
[(orders.)new.html.erb] <div class="toolbar"><%= link_to "オーダー選択に戻る", :orders_select, data: {"turbolinks" => false} %></div> <%= form_with model: @order, url: orders_path, method: :post do |f| %> <table> <tr> <th>製品</th> <th>入目(kg)</th> </tr> <tr> <td><input type="text" name="name" value="<%= @name %>"></td> <td><input type="integer" name="quantity_per_catron" value="<%= @quantity_per_catron %>"></td> </tr> </table> <div><%= f.submit %></div> <% end %>
ここにより詳細な情報を記載してください。
【orders.controller.rb】 def select @products = Product.all end def new @product = Product.new @product = Product.find_by(id: params[:product_id]) @product_name = params[:name] @product_quantity_per_catron = params[:quantity_per_catron] @order = Order.new end
【new.html.erb】 <% @page_title = "新規オーダー" %> <h2><%= @page_title %></h2> <div class="toolbar"><%= link_to "オーダー一覧に戻る", :orders, data: {"turbolinks" => false} %></div> <div class="toolbar"><%= link_to "オーダー選択に戻る", :orders_select, data: {"turbolinks" => false} %></div> <%= form_with model: @order do |f| %> <table> <tr> <th>製品</th> <th>入目(kg)</th> <th></th> <th>個数</th> <th></th> <th>amount(kg)</th> <th>納期</th> <th>納品先</th> <th>納品先住所</th> </tr> <tr> <td><input type="text" name="product_name" value="<%= @product.name %>"></td> <td><input type="integer" id="sample1" size=8 value="<%= @product.quantity_per_catron %>"></td> <td>×</td> <td><input type="select" name="sample2" id="sample2" size=8></td> <td>=</td> <td><input type="integer" name="quantity" id="result" size=15></td> <td><input type="date" name="due_date" %></td> <td><input type="text" name="delivery_name" value="" size=25></td> <td><input type="text" name="delivery_address" value="" size=45></td> </tr> </table> <div><%= f.submit %></div> <% end %>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/02 16:44
2020/05/02 21:01
2020/05/03 02:24 編集
2020/05/03 02:45
2020/05/03 03:27
2020/05/03 09:53
2020/05/03 09:57
2020/05/03 10:38
2020/05/04 11:51