前提・実現したいこと
開発環境
・Rails 4.2.10
・Ruby 2.5.0
・rbenv 1.1.1-30-gc8ba27f
・sqlite3
・OS debian 9.4
Ruby on Railsでプロジェクト管理システムを作っています。
入力済みのプロジェクト概要情報(例、担当者)を変更する機能を追加しようとしています。
修正画面ダイアログを表示し、inputフォームに修正内容を記入、送信し、修正が反映されるシステムを作っています。
その際、idが引き渡せないという下記のエラーが発生します。
発生している問題・エラーメッセージ
ActiveRecord::RecordNotFound in UpdateController#update Couldn't find Project with 'id'= Extracted source (around line #23): 22 def update 23 @project = Project.find(params[:id]) 24 if params[:mm] == 'y1801' 25 @project.y1801 = params[:money] 26 @project.y1801c1 = params[:m1] Rails.root: /home/“ユーザー名”/work/foo/internal-management-system Application Trace | Framework Trace | Full Trace app/controllers/update_controller.rb:23:in `update' Request Parameters: {"id"=>"", "edit_charge"=>"aa"}
該当のソースコード
app/controllers/update_controller.rb
class UpdateController < ApplicationController def edit @project = Project.find(params[:id]) if params[:charge] == 'charge' @project.charge = params[:charge] end @project.save redirect_to :root end def update @project = Project.find(params[:id]) if params[:mm] == 'y1801' @project.y1801 = params[:money] @project.y1801c1 = params[:m1] @project.y1801c2 = params[:m2] @project.y1801c3 = params[:m3] elsif params[:mm] == 'y1802' @project.y1802 = params[:money] @project.y1802c1 = params[:m1] @project.y1802c2 = params[:m2] @project.y1802c3 = params[:m3] (中略、elsifの繰り返し。) else if params[:charge]=='charge' @project.charge = params[:charge] end end @project.save redirect_to :root end end
app/views/read.html.erb
<div class="container"> <div class="starter-template"> <h3>PJ管理表</h3> </div> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addmodal">追加</button> <br> <!--Project Add Modal --> <div class="modal fade" id="addmodal" role="dialog"> <div class="modal-dialog"> <!-- Modal content--> <div class="modal-content"> <form action="/insert/insert"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h4 class="modal-title">PJ追加画面</h4> </div> <div class="modal-body"> (中略) </div> <table class="table table-striped table-bordered table-hover table-responsive" id="table"> <thead> <tr> <th class="text-center">編集</th> <th class="text-center">削除</th> <th class="text-center">No. <%= link_to "▼", sort: "no" %> </th> <th class="text-center">お客様 <%= link_to "▼", sort: "company" %> </th> <th class="text-center">担当 <%= link_to "▼", sort: "charge" %> </th> (中略) <th class="text-center">合計(百万円)</th> <th class="text-center">18/01</th> (中略) <th class="text-center">18/12</th> </tr> </thead> <tbody> <% @projects.each do |p| %> <tr> <td class="text-center"><a data-toggle="modal" href="#editModal" data-id=<%=p.id%> data-edit_charge =<%= p.charge%> >編集</a></td> <td class="text-center"><a data-toggle="modal" href="#delModal" data-id=<%=p.id%> >削除</a></td> <td class="text-right"><a data-toggle="modal" href="#outline" data-id=<%=p.no%> ><%= p.no %></a></td> <td clsss="text-left"><%= p.company %></td> <td class="text-left"><a data-toggle="modal" href="#progress_charge" data-id=<%=p.charge%> ><%= p.charge %></td> <td class="text-left"><a data-toggle="modal" href="#progress" data-id=<%=p.task%> ><%= p.task %></td> <td class="text-left"><%= p.level %></td> <td><%= p.y1801+p.y1802+p.y1803+p.y1804+p.y1805+p.y1806+p.y1807+p.y1808+p.y1809+p.y1810+p.y1811+p.y1812 %></td> <td class="text-right"><a data-toggle="modal" href="#myModal" data-id=<%=p.id%> data-mm="y1801"><%= p.y1801 %></a></td> (中略) <td class="text-right"><a data-toggle="modal" href="#myModal" data-id=<%=p.id%> data-money=<%=p.y1812%> data-m1=<%=p.y1812c1%> data-m2=<%=p.y1812c2%> data-m3=<%=p.y1812c3%> data-mm="y1812"><%= p.y1812 %></a></td> </td> </tr> <% end %> <td colspan="8" align="right"> 月ごとの合計(百万円) </td> <td align="right"><%=@total_y1801 %></td> (中略) <td align="right"><%=@total_y1812 %></td> </tbody> </table> <!-- Money, Event Add Modal --> <div class="modal fade" id="myModal" role="dialog"> <div class="modal-dialog"> <!-- Modal content--> <div class="modal-content"> <form action="/update/update"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h4 class="modal-title">金額を記入してください</h4> </div> <div class="modal-body"> <input type="hidden" id="id" name="id" value =""> <input type="hidden" id="mm" name="mm" value =""> <div class="form-group"> <p>1. 金額(百万円)を入力してください。</p> <input type="text" id="money" name="money" value="" class="form-control"> <br> </div> <div class="modal-footer"> <button type="submit" class="btn btn-success">保存</button> <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button> </div> </form> </div> </div> </div> <!--Modal Project(outline)--> <div class="modal fade" id="outline" role="dialog"> (中略) </div> <!--Edit content--> <div class="modal fade" id="editModal" role="dialog"> <div class = "model-dialog"> <!-- Modal content--> <div class="modal-content"> <form action="/update/update" class="form-group"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h4 class="modal-title">Edit</h4> <p>PJ編集</p> </div> <div class-"modal-body"> <input type="hidden" id = "id" name="id" class="form-control"> <div class="form-group"> <p>担当編集</p> <input type="text" id="edit_charge" name="edit_charge" value="" class="form-control"> <br> </div> </div> <div class="modal-footer"> <button type="submit" class="btn btn-success">保存</button> <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button> </div> </form> </div> </div> </div> <!-- delete Modal --> <div class="modal fade" id="delModal" role="dialog"> <div class="modal-dialog"> <!-- Modal content--> <div class="modal-content"> <form action="/delete/delete"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">×</button> <h4 class="modal-title">本当に削除しますか?</h4> </div> <div class="modal-body"> <input type="hidden" id="id" name="id" value =""> </div> <div class="modal-footer"> <button type="submit" class="btn btn-success">はい</button> <button type="button" class="btn btn-default" data-dismiss="modal">いいえ</button> </div> </form> </div> </div> </div> <!--Progress content--> <div class="modal fade" id="progress" role="dialog"> (中略) </div> <!--per Charge content--> <div class="modal fade" id="progress_charge" role="dialog"> (中略) </div> <script> $('#myModal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget) var idTxt = button.data('id') var mmTxt = button.data('mm') var moneyTxt = button.data('money') var modal = $(this) modal.find('.modal-body input#id').val(idTxt) modal.find('.modal-body input#mm').val(mmTxt) }); $('#editModal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget) var idTxt = button.data('id') var chargeTxt = button.data('charge') var modal = $(this) console.log(idTxt) modal.find('.modal-body input#id').val(idTxt) modal.find('.modal-body input#charge').val(chargeTxt) }); function comma(str) { return str.replace(/(\d)(?=(?:\d{3})+(?!\d))/g, '$1,'); } $('#delModal').on('show.bs.modal', function (event) { (中略) }); //iconsole.log(idTxt); </script> </div><!-- /.container -->
試したこと
・update_controller.erbにdef update1に記載した。
->routesが定義されていないとメッセージが出る。
・def editに追記した。
->defaultのedit画面に遷移した。
・read_controller.erbのid入力フォームの<input type=”hidden”~~ >のhiddenをtextにし、idを手打ちで入力すると、エラーが発生しない。しかし修正内容も反映されない。
<div class="modal fade" id="editModal" role="dialog"> <div class = "model-dialog"> (中略) <input type="hidden" id = "id" name="id" class="form-control">
・rails consoleに以下のコマンドを入力すると、正常に変更が反映される。
sqlite> update "projects" set "charge"='test' where id=22;
(補足情報 charge:プロジェクト担当者の氏名)
・Google Chromeの開発コンソールで、JavaScript部にbreakpointを設定し、格納されている変数を確認したところ、idの有意な値(例、22)が格納されていた。
補足情報
・金額入力画面ダイアログ(<div class=”modal fade” id=”myModal” role-“dialog”>で定義される領域)は、金額を送信・反映できるます。
追加情報
Modelファイルの情報を追加します。
user.rb
class User < ActiveRecord::Base end
project.rb
class Project < ActiveRecord::Base def self.search(search) if search Project.where(['name LIKE ?', "%#{search}%"]) else Project.all end end end
あなたの回答
tips
プレビュー