やりたいこと:text_fieldに入力されたデータをFormDataで取得したい
失敗パターンその1(form_for自体にID、classを指定していなかった)
app/view/messages/index.haml
.view__message--new
= form_for([@chat_group, @message]) do |f|
= f.text_field :body, placeholder: "type a message", class: "view__message--new__input"
%i.fa.fa-picture-o{ aria: { hidden: true } }
= f.submit :Send, class: "view__message--new__button"
app/assets/javascripts/message.js
$(function() {
~中略~
$('.view__message--new').on('submit', function(e){
e.preventDefault();
var fd = new FormData($(this).get(0));
//form_forの親要素のクラス.view__message--newがsubmitされた時に発火
//同様にそこからFormDataを取得できるかと思ったが失敗。
失敗パターンその2(form_forの親クラスである.view__message--newにid: new_messageを付けた)
app/view/messages/index.haml
#new_message.view__message--new
= form_for([@chat_group, @message]) do |f|
= f.text_field :body, placeholder: "type a message", class: "view__message--new__input"
%i.fa.fa-picture-o{ aria: { hidden: true } }
= f.submit :Send, class: "view__message--new__button"
app/assets/javascripts/message.js
$(function() {
~中略~
$('#new_message').on('submit', function(e){
e.preventDefault();
var fd = new FormData($(this).get(0));
//これも取得できず。
//原因はhamlからHTMLに変換される際、form_forにもid: new_messageが振られ重複したため?
下記のようにして取得できた
*viewは上記と同様
app/assets/javascripts/message.js
$(function() {
~中略~
$('#new_message').on('submit', function(e){
e.preventDefault();
var fd = new FormData($('form#new_message').get(0));
//FormDataの対象idにformを付けたら取得できました。
最終的にこうしました
app/view/messages/index.haml
.view__message--new
= form_for([@chat_group, @message], html: { id: 'new_message' }) do |f|
= f.text_field :body, placeholder: "type a message", class: "view__message--new__input"
%i.fa.fa-picture-o{ aria: { hidden: true } }
= f.submit :Send, class: "view__message--new__button"
app/assets/javascripts/message.js
$(function() {
~中略~
$('#new_message').on('submit', function(e){
e.preventDefault();
var fd = new FormData($(this).get(0));
結論
最初からform_for自体にidを付けていれば何の問題もありませんでした。