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

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

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

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

Heroku

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

Ruby on Rails

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

Q&A

解決済

2回答

266閲覧

【Rails】Heroku上でチェックボックスに最初からcheckedが入ってしまう

Romay

総合スコア40

Ruby

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

Heroku

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/04/18 21:08

前提・実現したいこと

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

開発環境では、リロード時や読み込み時にチェックボックスにはチェックが入っていないのですが、
本番環境では、リロード時や読み込み時に全てのチェックボックスにチェックが入ってしまいます。

該当のソースコード

以下のビューからユーザーがチェックボックスをチェックできる仕様

edit.html.erb

erb

1<% if @items.present? %> 2 <div id="item-content"> 3 <% @items.each do |item| %> 4 <%= render partial: "item", locals: { item: item } %> 5 <% end %> 6 </div> 7<% end %>

ここが原因だと思われる。
_item.html.erb

ruby

1<%= check_box_tag '', '', item.check, {'data-id' => item.id, 'data-user-id' => item.user_id ,class: "check_#{item.id} option-input"} %>

該当するmigrationファイルです。
checkはbooleanに設定しています。

create_items.rb

ruby

1class CreateItems < ActiveRecord::Migration 2 def change 3 create_table :items do |t| 4 t.integer :user_id 5 t.text :text 6 t.boolean :check, default: false, null: false 7 8 t.timestamps null: false 9 end 10 end 11end

試したこと

check_box_tag は、name、value、初期値、オプションの順番に引数を取ると認識しているので、初期値にitem.checkを入れているのですが、item.checkの値(0か1)に関わらず、チェックがついてしまいます。

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

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

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

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

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

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

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

guest

回答2

0

本番環境側のDBのテーブル構造を確認すべきと思います。

なんらかの事故・急場しのぎの結果カラム型がbooleanではなくintegerになっているのかな、と


追記
とりあえず、テーブル構造に依存せずにbooleanと認識させる方法

ruby

1class Item < ActiveRecord::Base 2 # attribute :checked, :boolean, default: false でも大丈夫かも? 3 attribute :checked, ActiveRecord::Type::Boolean.new, default: false 4end

投稿2019/04/19 01:24

編集2019/04/19 08:04
asm

総合スコア15147

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

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

0

ベストアンサー

https://teratail.com/questions/184104#reply-275290 で触れたように、Rubyでは 01 も true とみなされます。toggle と同様の判定条件で処理するのがよいと思います。

投稿2019/04/18 23:37

iwamot

総合スコア1154

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

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

Romay

2019/04/19 00:12

こちらも回答いただきありがとうございます。おっしゃる通りですね。。。! 追加で教えていただければ大変嬉しいのですが、こちらなぜ開発環境では問題ないのでしょうか。  本番環境の場合(heroku)、0の場合でも1の場合でも、'item.check'はtrueとして判定され、チェックボックス にチェックが入ってしまうということだと思いますが、開発環境でも0と1でmySQL上で保存されています。 これは、mySQLのDB上では0と1と表示されているものの中身は、trueとfalseで分けられているため、'item.check'が正しく動作しているということでしょうか? つまり、mySQLとpostgreSQLでは、'trueとfalse'、'1と0' としてbooleanの値の保存の仕方が違うのでしょうか。 知識が浅く稚拙な質問で大変恐縮ですが、ご教授頂けますと幸いです。
iwamot

2019/04/19 03:15

ぼくも詳しくないのですが、MySQLの場合はRails(あるいはそのライブラリ)がbooleanに変換してくれ、PostgreSQLの場合は変換してくれないのだと思います。ちなみに、item.check? だとどうなるか、各環境の挙動を調べてみるのもよさそうです。
Romay

2019/04/19 06:02

なるほど、その可能性が高そうですね。ご丁寧にご回答いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問