実装イメージ
「こんにちは」ボタンを押すと「上のボタンを押すとメッセージが変わるよ!」のところが「こんにちは」に
「こんばんは」を押すと「こんばんは」にページ遷移せず変わります。
さくっとコード
装飾のコードは抜いています。
config/routes.rb
Rails.application.routes.draw do
get '/example', to: 'example#index'
post '/example/greet', to: 'example#greet'
end
app/controllers/example_controller.rb
class ExampleController < ApplicationController
layout "application"
def index
@message = "上のボタンを押すとメッセージが変わるよ!"
end
def greet
@message= params[:greet]
end
end
上記のlayoutはrails-ujsを使えるやつで
最近のrailsだとデフォルトで使えるはず。。。知らんけど。。。。。
app/views/example/index.html.slim
h1 rails-ujs使用例
/ link_toで実装
= link_to example_greet_path(greet: "こんにちは"), method: :post, remote: true do
p こんにちは
/ form_withで実装
= form_with url: example_greet_path, remote: true do
= hidden_field_tag :greet, "こんばんは"
= submit_tag "こんばんは"
#js-greet
= render partial: "greet"
app/views/example/_greet.html.slim
p = @message
app/views/example/greet.js.erb
document.querySelector("#js-greet").innerHTML = "<%= j(render partial: "greet") %>"
解説
厳密さにかけているかもです、なんとなく察してください
formやlinkにremote: trueをつけると非同期でcontrollerのgreetメソッドを経由しgreet.js.erbが実行されます。
このサンプルのgreetメソッドはparamsを変数に入れているだけですが、
modelを操作して結果を返すのが主になると思います。