form_with

form_withとhidden_field

app/views/users/_follow.html.erb

<%= form_with(model: current_user.active_relationships.build, local: true) do |f| %>
  <div><%= hidden_field_tag :followed_id, @user.id %></div>
  <%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>

app/views/users/_unfollow.html.erb

<%= form_with(model: current_user.active_relationships.find_by(followed_id: @user.id),
            html: { method: :delete }, local: true) do |f| %>
  <%= f.submit "Unfollow", class: "btn" %>
<% end %>

app/controllers/relationships_controller.rb

class RelationshipsController < ApplicationController
  before_action :logged_in_user

  def create
    user = User.find(params[:followed_id])
    current_user.follow(user)
    redirect_to user
  end

  def destroy
    user = Relationship.find(params[:id]).followed
    current_user.unfollow(user)
    redirect_to user
  end
end

「form_for, form_with」では、コントローラーで作成したインスタンスがnewメソッドで新たに作成され、 何も情報を持っていなければ自動的にcreateアクションへ、editアクションなどで作成され、 すでに情報を持っている場合はupdateアクションへ自動的に振り分けてくれる?

followed_idをヘルパーから受け取る必要があるのでhidden_fieldを用いてコントローラで処理 直接的に入力してもらわない