Help us understand the problem. What is going on with this article?

Laravelで、チェックボックスをPOSTした後の old() 問題

More than 1 year has passed since last update.

これで3時間くらいハマった。

前提

Laravel 5.1

問題

下記のようなチェックボックスを含む値をPOSTする状況でデフォルト値の設定に悩む。

  • users の編集画面
  • users.is_active = 1 から users.is_active = 0 に変更する
  • users.is_active 用のチェックボックスをONからOFFに変更してPOST
  • 別の項目でバリデーションに引っかかり、入力画面に戻る
  • users.is_active 用のチェックボックスはOFFになっていてほしい

残念ながら、チェックボックスはONになっている。

<input type="checkbox" {{ (old('is_active', $user->is_active) ? 'checked' : '' }}>

としても、 old('is_active', $user->is_active) は、チェックボックスをOFFにしていると old('is_active')null のため、デフォルトの $user->is_active が呼ばれてチェックが付いてしまう。

これと同じ問題。

https://stackoverflow.com/questions/16884032/unchecked-checkbox-with-inputold/44899036#44899036

解決策

Laravel Collective とか使えばいいのだろうか。試していないが同じ問題が起きそうなのでやめた。

ちょっとださいが、仕方がないので下記ヘルパーを作って解決した。

app/helpers.php
function is_checked(string $name, $value, $default) : string
{
    $current_defaults = Input::old() ? old($name, 0) : $default;
    return ($value == $current_defaults) ? 'checked' : '';
}
resources/views/user/edit.blade.php
<input type="checkbox" name="is_acrive" value="1" 
       {{ is_checked('is_active', 1, $user->is_active) }}>

Multiple checkbox version:

app/helpers.php
function is_checked_multiple(string $name, $value, $defaults) : string
{
    $current_defaults = Input::old() ? old($name, []) : (array)$defaults;
    return in_array($value, $current_defaults) ? 'checked' : '';
}
resources/views/user/plans/edit.blade.php
@foreach ($plans as $plan)
    <input type="checkbox" name="plans[]" value="{{ $plan->id }}" 
           {{ is_checked_multiple('plans', $plan->id, $user->plans->pluck('id') }}>
@endforeach

== の曖昧比較なのは、 old() の値は文字列になるから。

追記

@nunulk さんのご指摘の通り、 laravelcollective/html では問題なく動作することを確認できました。
記述も短くなるしこれ使った方がいいな・・・

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした