環境
Vagrant + Ubuntu 16.04.5 LTS
Rails 5.2.4.2
jQuery
slim
やった事
入力フィールドを入力不可にするには、jQueryでこのように記述する事になります。しかし、disabledにすれば、ビューからコントローラに送信されない事が判明。つまり、Railsのコントローラ側で該当のカラムが更新されない事になります。なんと!
$("#task_todofuken").prop('disabled', false);
そこで、次のやり方で、readonlyにすれば、サーバーへ送信されるようになります。
$("#task_todofuken").attr('readonly', true);
text_fieldであればこのやり方でいいのだが、今回はselectフィールドを利用しており、そもそも、selectフィールドにはreadonlyの属性を持っていない。
(ぼやき:よくよく考えれば、selectフィールドでreadonlyにする意味はないかも知れないので、このような仕様にしている理由も分からなくはないが、開発者には何かと様々な事情が出てくる事もあろう)
参考 ※disabledとreadonlyの違いについて詳しい
https://www.sejuku.net/blog/36294
ちなみに、disabledも、readonlyも利用せずに、このようにselectフィールドを初期化すると、プルダウン表示が復活しなくなるため、このやり方も使えない事になります。
$('#task_todofuken').html("<option value=''></option>");
そこで、ビューの中で、todofukenのselectフィールドとは別に、hidden_fieldという隠し項目を重複して作ってしまう。隠し項目は必ずサーバーに送信されるため、selectフィールドがdisabledになっていても更新される事になります。disabledがfalseの状態になっている場合、重複して送信される事になるが特に問題はないようです。
// 都道府県
.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フィールドが選択されたタイミングで、隠しフィールドにも値を反映させるようにします。
$(function(){
$('#task_todofuken').change(function() {
var input = $.trim($(this).val());
$("#task_todofuken_hidden").val(input);
})
})
これでOK