前提・実現したいこと
Ruby 2.4.5
Rails 4.2.8
本番環境:heroku postgreSQL
開発環境:mySQL
以下やりたいことの流れです。
- users/editのviewにおける部分テンプレート、_item.html.erbのチェックボックスをチェック
↓
2. javascript発動で、item_controllerのtoggleアクションを動かす(POST送信)
↓
3. item_controllerのtoggleアクションで、「check」カラムが、0だったら1、1だったら0にして保存
itemというテーブルの、checkというカラムをチェックボックスをチェックするごとに0と1に変えるということが目的です。
開発環境では正常に動作しているtoggleの機能(0と1でデータ交換するだけ)が、heroku上の本番環境ではうまくいきません。
herokuのログを見る限り、チェックボックスチェック時にtoggleデータ送信するJavaScriptは動き、コントローラーも動いています。
おそらく、mySQLとpostgresqlの何かしらの仕様の違いによって、この問題が生じているのではと推測しています。
発生している問題・エラーメッセージ
heroku上のログです。
heroku
12019-04-07T05:56:47.929678+00:00 app[web.1]: [1m[36mItem Load (1.1ms)[0m [1mSELECT "items".* FROM "items" WHERE "items"."deleted_at" IS NULL AND "items"."id" = $1 LIMIT 1[0m [["id", 4]] 22019-04-07T05:56:47.931283+00:00 app[web.1]: [1m[35m (1.0ms)[0m BEGIN 32019-04-07T05:56:47.934576+00:00 app[web.1]: [1m[36mSQL (1.4ms)[0m [1mUPDATE "items" SET "check" = $1, "updated_at" = $2 WHERE "items"."id" = $3[0m [["check", 0], ["updated_at", "2019-04-07 05:56:47.931522"], ["id", 4]] 42019-04-07T05:56:47.938156+00:00 app[web.1]: [1m[35m (2.9ms)[0m COMMIT 52019-04-07T05:56:47.938440+00:00 app[web.1]: Completed 200 OK in 18ms (Views: 0.5ms | ActiveRecord: 9.8ms) 62019-04-07T05:56:47.943427+00:00 heroku[router]: at=info method=POST path="/items/4/toggle" host=********(URL名) request_id=757251******39b-814e-baf49b5fe545 fwd="173*****114" dyno=web.1 connect=0ms service=36ms status=200 bytes=880 protocol=https
該当のソースコード
部分テンプレート
_item.html.erb
ruby
1<li class="idea"> 2 <div class="idea-text"> 3 <div class="checked-item_<%= "#{item.id}"%>" > 4 <%= item.text %> 5 </div> 6 </div> 7 <div class="item-menu-right"> 8 <%= link_to item_path(item), method: :delete , remote: true do %> 9 <i class="fa fa-trash fa-fw" aria-hidden="true"></i> 10 <% end %> 11 <%= link_to edit_item_path(item), method: :get ,class: "fa-edit-margin", item_id: item.id do %> 12 <i class="fa fa-edit fa-fw" aria-hidden="true" ></i> 13 <% end %> 14 15 <%= check_box_tag '', '', item.check, {'data-id' => item.id, 'data-user-id' => item.user_id ,class: "check_#{item.id} option-input"} %> 16 17 </div> 18</li> 19 20<!-- チェックつけたら赤取り消し線つける --> 21<script> 22 23$(function() { 24 $('.check_<%= "#{item.id}"%>').on('click', function() { 25 if ( $(this).prop('checked') == false ) { 26 $('.checked-item_<%= "#{item.id}"%>').removeClass("delete-text"); 27 } else { 28 $('.checked-item_<%= "#{item.id}"%>').addClass("delete-text"); 29 } 30 }); 31}); 32 33// ロードしたときに、item.check == 1 ならdelete-textをつける処理。 34$(function(){ 35 if (<%=h item.check %> == 1) { 36 $('.checked-item_<%= "#{item.id}"%>').addClass("delete-text"); 37 } else { 38 $('.checked-item_<%= "#{item.id}"%>').removeClass("delete-text"); 39 } 40}); 41</script>
チェックボックスチェック時にデータ送信するjavascriptファイル
javascrpt
1$(document).on('turbolinks:load', function() { 2 $("input[type=checkbox]").click(function(){ 3 $.post('/items/'+$(this).data('id')+'/toggle'); 4 }); 5}); 6
items_controller.rb
ruby
1 def toggle 2 render nothing: true 3 @item = Item.find(params[:id]) 4 @item.check = !@item.check 5 @item.save 6 end
試したこと
mySQLだと、checkカラムは、tinyintになっていますが、herokuのpostgreSQLだとこれが違う構造になっているのではないか思います。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー