Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

booleanのfalseだけ表示させたい

チェックされていない内容のみ表示させる。

お問い合わせ機能を実装しました。お問い合わせ(contact)モデルにはboolean型のカラムがあり、trueなら既読、falseなら未読というようにしています。

一覧画面でボタンをクリックすると、チェックされていないfalseのお問い合わせのみが表示されるのが理想です。

現在の状況

 t.boolean "check", default: false, null: false
contact_controller.rb
def index
  @contacts = Contact.where(check: 'false')
end

こう記述することで表示することは可能でした。
ですが、ボタンクリックで切り替えるという動作はそもそもどう実装するべきなのか全く見えてきません。

方法をご存知の方いらっしゃらないでしょうか?

0

5Answer

クライアントからのリクエストに応じて、checkがfalseのcontactsだけを絞り込みたいということでしょうか?

formで、your-url.com/path-to-the-route?check=falseというGETリクエストを送って、Controller側でparams[:check]の値を取得してクエリを出し分けるのがシンプルだと思います。

ちなみに、ご質問のコードにあるcheck: 'false'は期待どおりに動くんですか?boolean型のカラムに、bool値のfalseではなく文字列の'false'を与えて正しいSQLが発行されるのか気になりました。

あと、これも余計なお世話ですが、チェックされたかを示すフィールドであれば、checkよりcheckedや、is_checkedの方が読みやすいかもしれませんね。

0Like

Comments

  1. @OmaeWa000

    Questioner

    ご回答ありがとうございます。


    >>>ちなみに、ご質問のコードにあるcheck: 'false'は期待どおりに動くんですか?boolean型のカラムに、bool値のfalseではなく文字列の'false'を与えて正しいSQLが発行されるのか気になりました。

    こちらに関してはどちらでも問題なく動きました。
    一応書き直しておきました。

    >>>チェックされたかを示すフィールドであれば、checkよりcheckedや、is_checkedの方が読みやすいかもしれませんね。

    ありがとうございます。命名したときにどうするべきか迷ったのですが、自分だけでの開発だったので深く考えず命名しました。
    次回気を付けようと思います。

    >>>formで、your-url.com/path-to-the-route?check=falseというGETリクエストを送って、Controller側でparams[:check]の値を取得してクエリを出し分けるのがシンプルだと思います。

    your-url.com/path-to-the-route?check=falseこの記述?リクエストについては初めて見ました。申し訳ありませんが、少しだけ詳しく説明していただくことは可能でしょうか?

  2. ほんとですか!?文字列のfalseをbool値のfalseに読み替えてくれるなんて知りませんでした。もしよければ、Contact.where(check: 'false').to_sql、で生のSQLを覗かせて欲しいです。

    GETリクエストに関しては全く難しくなく`<form action="/path-to-the-route?check=false"></form>`でボタンを囲んで、ボタンエレメントの属性を`type="submit"`にするだけです。
    これは生のHTMLですが、Railsなら`form_with url: path-to-the-route?check=false`でいい感じのHTMLを生成してくれるはずです。

    Railsは魔法みたいな関数が素のウェブアプリへの理解を妨げることが往々にしてあるので、余裕があればHTMLのformについて先に理解することをお勧めします。

引き続き回答いただきありがとうございます。

まずSQLですが使用したことのないコマンド?でしたので質問に答えられているかわかりませんが、一応お知らせします。

Contact.where(check: 'false').to_sql
 => "SELECT \"contacts\".* FROM \"contacts\" WHERE \"contacts\".\"check\" = 0" 

それから、先ほど教えていただいたフォームですが、想定通りの動きをせず、Route errorになってしまいます。
もしかしますと、自分がやりたいことが伝わっていないかもしれません。

スクリーンショット (1).png

画像の"チェック"と書いてあるところをクリックするとチェックされていないfalseのみのリストになるといった感じです。

0Like

ちゃんと'false'が0に解釈されるんですね。。初めてこの仕様知りました。

それはさておき、

それから、先ほど教えていただいたフォームですが、想定通りの動きをせず、Route errorになってしまいます。

具体的にどのようなコードを書きましたか?

0Like
<form action="/path-to-the-route?check=false">
<button type="submit">ボタン</button>
</form>

こう書きました。form_withで書くと構文エラーになってしまったので、正しい書き方を調べたのちためそうと考えていました。

コントローラ等ものせておいた方がよろしいでしょうか?

0Like

Comments

  1. @OmaeWa000

    Questioner

    ~~~
    <form action="contacts?check=false">
    <button type="submit">ボタン</button>
    </form>
    ~~~

    このように表記してみました。
    うまくうごきませんでした。

    urlは

    https://自分のURL/contacts?

    のようになりましたがこれで正しいのでしょうか?
  2. action="/contacts?check=false"でもダメでしょうか?エラーならばエラーの内容も教えて欲しいです
  3. @OmaeWa000

    Questioner

    どちらの書き方でも同じ挙動をしました。
    一応試してみたことまとめておきます。

    <form action="/contacts?check=false">
    <button type="submit">ボタン</button>
    </form>

    <form action="contacts?check=false">
    <button type="submit">ボタン</button>
    </form>

    <form action="contacts?check:false">
    <button type="submit">ボタン</button>
    </form>

    以上はすべて同じような挙動をしていると思います。
    エラーは出ていません。


    viewファイルも記載して質問しなおしてみたいと思います。
    ご回答ありがとうございました。

Your answer might help someone💌