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

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

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

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1412閲覧

【Rails】herokuのPostgreでboolean型のデータ送信ができない。

Romay

総合スコア40

Ruby

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/04/12 05:20

前提・実現したいこと

以前質問した内容ですが回答を得られなかったので再掲です。

Ruby 2.4.5
Rails 4.2.8
本番環境:heroku postgreSQL
開発環境:mySQL

以下やりたいことの流れです。

  1. 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上の本番環境ではうまくいきません。

PostgreSQLでbool型をintにキャスト
こちらの記事にあるように、PostgreSQLのboolean型の仕様が、trueの場合はtrueでfalseの場合は0という挙動をすることが原因であるように思います。
しかし、これに対処する方法が思いつかず足止めされている状況です。

発生している問題・エラーメッセージ

heroku上のログです。

heroku

12019-04-07T05:56:47.929678+00:00 app[web.1]: Item Load (1.1ms) SELECT "items".* FROM "items" WHERE "items"."deleted_at" IS NULL AND "items"."id" = $1 LIMIT 1 [["id", 4]] 22019-04-07T05:56:47.931283+00:00 app[web.1]:  (1.0ms) BEGIN 32019-04-07T05:56:47.934576+00:00 app[web.1]: SQL (1.4ms) UPDATE "items" SET "check" = $1, "updated_at" = $2 WHERE "items"."id" = $3 [["check", 0], ["updated_at", "2019-04-07 05:56:47.931522"], ["id", 4]] 42019-04-07T05:56:47.938156+00:00 app[web.1]:  (2.9ms) 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 #ここの処理を色々変えてみる 5 @item.check = !@item.check 6 @item.save 7 8   #これもうまくいかない 9   if @item.check.is_a?(FalseClass) 10 @item.check = '1' 11 else 12 @item.check = '0' 13 end 14 @item.save 15 16   #これもうまくいかない 17   if @item.check.is_a?(FalseClass) 18 @item.check = true 19 else 20 @item.check = false 21 end 22 @item.save 23 24   #これもうまくいかない 25   if @item.check.is_a?(FalseClass) 26 @item.check = (TrueClass) 27 else 28 @item.check = (FalseClass) 29 end 30 @item.save 31 end

試したこと

原因であると思われるものは特定できているのですが、それに対応できずにいる状況です。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

下記のようにするといかがでしょうか。

ruby

1 if @item.check == 0 2 @item.check = 1 3 else 4 @item.check = 0 5 end 6 @item.save

ちなみに、Rubyでは !0!1 も false になります。

開発環境で動かなくなってしまうようであれば、型や Rails.env を判定条件に追加するのがよいと思います。欲をいえば、開発環境と本番環境のデータベースを統一したいところです。

投稿2019/04/18 09:22

iwamot

総合スコア1154

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

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

Romay

2019/04/18 21:09

回答ありがとうございます。Rails.envで条件分岐することで本番環境でも0と1のtoggleがうまくできるようになりました!ありがとうございます。
guest

0

Ruby

1 if @item.check.is_a?(FalseClass) 2 @item.check = 't' 3 else 4 @item.check = 'f' 5 end 6 @item.save 7#または 8 if @item.check.is_a?(FalseClass) 9 @item.check = 'true' 10 else 11 @item.check = 'false' 12 end 13 @item.save

ではどうでしょう。

まあ、データを取得してダンプで確認するのが確実だと思いますけど。

投稿2019/04/12 05:35

sazi

総合スコア25138

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

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

Romay

2019/04/12 05:45

回答ありがとうございます。 どちらも試してみましたが、開発環境では問題ないもののherokuの本番環境ではうまくいきませんでした。 本番環境のログを見ると、trueの場合でもfalseの場合でも、「0」が送信されているように思います。
sazi

2019/04/12 05:47

じゃあ、文字じゃなく数値の0,1ではどうなんでしょう。
Romay

2019/04/12 06:55

数値でも、うまくいかないようです。 以下のHerokuのログを見る限り、checkのカラムに対する動作がされていないように思います。 2019-04-12T06:52:46.063072+00:00 heroku[router]: at=info method=POST path="/items/9/toggle" host=*********** request_id=7dd47e91-**********1988769b9d fwd="173****.114" dyno=web.1 connect=1ms service=34ms status=200 bytes=880 protocol=https 2019-04-12T06:52:46.032118+00:00 app[web.1]: Started POST "/items/9/toggle" for 173.164.137.114 at 2019-04-12 06:52:46 +0000 2019-04-12T06:52:46.039229+00:00 app[web.1]: Processing by ItemsController#toggle as */* 2019-04-12T06:52:46.039309+00:00 app[web.1]: Parameters: {"id"=>"9"} 2019-04-12T06:52:46.044635+00:00 app[web.1]: User Load (2.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 2]] 2019-04-12T06:52:46.047179+00:00 app[web.1]: Rendered text template (0.0ms) 2019-04-12T06:52:46.050350+00:00 app[web.1]: Item Load (1.7ms) SELECT "items".* FROM "items" WHERE "items"."deleted_at" IS NULL AND "items"."id" = $1 LIMIT 1 [["id", 9]] 2019-04-12T06:52:46.052711+00:00 app[web.1]:  (1.5ms) BEGIN 2019-04-12T06:52:46.058853+00:00 app[web.1]:  (4.5ms) COMMIT 2019-04-12T06:52:46.059194+00:00 app[web.1]: Completed 200 OK in 20ms (Views: 0.6ms | ActiveRecord: 10.0ms)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問