form_withのlocalオプション

form_withではデフォルトでremote :trueになっている。

これを解除するのがlocalオプション。

デフォルトのままでは、
フォームは非同期通信としてJS方式で送られてしまう。

この場合、例えばビューからコントローラにフォームの内容を送って
そこから別アクションへリダイレクトする際、
画面遷移されずエラーになる。

これはredirect_toが非同期通信に対応していないため反応しない。

redirect_toを有効にするには、
同期通信としてHTML方式で送る必要があるため
form_withのオプションにlocal :trueをつけることで解決。



 

(/_form.html.erb)

<%= form_with model: @post, local: true do |f| %>
  <%= f.label :body %>
  <%= f.text_area :body %>
  <%= f.submit %>
<% end %>
(/posts_controller.rb)

def new
  @post = Post.new
end

def create
  @post = Post.new(board_params)
  if @board.save
    redirect_to posts_path
  else
    render :new
  end
end