0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

入力不可にしたセレクト項目をRailsに送信するTips

Posted at

環境

Vagrant + Ubuntu 16.04.5 LTS
Rails 5.2.4.2
jQuery
slim

やった事

入力フィールドを入力不可にするには、jQueryでこのように記述する事になります。しかし、disabledにすれば、ビューからコントローラに送信されない事が判明。つまり、Railsのコントローラ側で該当のカラムが更新されない事になります。なんと!

tasks_index.js
$("#task_todofuken").prop('disabled', false);

そこで、次のやり方で、readonlyにすれば、サーバーへ送信されるようになります。

tasks_index.js
$("#task_todofuken").attr('readonly', true);

text_fieldであればこのやり方でいいのだが、今回はselectフィールドを利用しており、そもそも、selectフィールドにはreadonlyの属性を持っていない。
(ぼやき:よくよく考えれば、selectフィールドでreadonlyにする意味はないかも知れないので、このような仕様にしている理由も分からなくはないが、開発者には何かと様々な事情が出てくる事もあろう)

参考 ※disabledとreadonlyの違いについて詳しい
https://www.sejuku.net/blog/36294

ちなみに、disabledも、readonlyも利用せずに、このようにselectフィールドを初期化すると、プルダウン表示が復活しなくなるため、このやり方も使えない事になります。

tasks_index.js
$('#task_todofuken').html("<option value=''></option>");

そこで、ビューの中で、todofukenのselectフィールドとは別に、hidden_fieldという隠し項目を重複して作ってしまう。隠し項目は必ずサーバーに送信されるため、selectフィールドがdisabledになっていても更新される事になります。disabledがfalseの状態になっている場合、重複して送信される事になるが特に問題はないようです。

_form.html.slim
// 都道府県
.form-group.row
    .col-sm-2
        = f.label :todofuken, class: 'control-label'
    .col-sm-10
        = f.select :todofuken, 
                ['北海道','青森県','岩手県', ・・・以下略],
                {include_blank: true}, 
                class: 'selectpicker form-control',
                id: 'task_todofuken'

// 都道府県(隠し項目)
.form-group
    .col-sm-10
        = f.hidden_field :todofuken, 
                class: 'form-control bg-warning', 
                id: 'task_todofuken_hidden'

そして、selectフィールドが選択されたタイミングで、隠しフィールドにも値を反映させるようにします。

tasks_index.js
$(function(){
	$('#task_todofuken').change(function() {
		var input = $.trim($(this).val());  
        $("#task_todofuken_hidden").val(input);
    })
})

これでOK

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?