LoginSignup
8
3

More than 5 years have passed since last update.

RailsのFormData取得で気をつけたいこと

Posted at

やりたいこと: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を付けていれば何の問題もありませんでした。

8
3
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
8
3