http://localhost:3000/memorials/mem_DjOYiIPi81Ba3H-john-doe/manage
So a Memorial has_many MemorialInvitation.
To render this page, I go:
# memorial_controller
def show
@tab = params["tab"]
if @tab == "manage"
@memorial_invitation = MemorialInvitation.new
@pending_memorial_invitations = @memorial.memorial_invitations.pending
@accepted_memorial_invitations = @memorial.memorial_invitations.accepted
end
end
# in show.html.erb
<%= render "memorial_invitations/form", memorial: @memorial, memorial_invitation: @memorial_invitation %>
In the memorial_invitations controller, I go:
def create
@tab = "manage"
@memorial_invitation = MemorialInvitation.new(
memorial_invitation_params.merge(
user_id: current_user.id,
memorial_id: @memorial.id
)
)
respond_to do |format|
if @memorial_invitation.save
# Send the invite email to the user.
token = @memorial_invitation.generate_token_for(:invitation_token)
UserMailer.with(token: token, memorial: @memorial_invitation.memorial).invite_email.deliver_later
format.html { redirect_to memorial_tab_path(@memorial, tab: "manage"), notice: "Memorial Invitation was successfully created." }
format.json { render :show, status: :created, location: @memory }
else
@pending_memorial_invitations = @memorial.memorial_invitations.pending
@accepted_memorial_invitations = @memorial.memorial_invitations.accepted
format.html { render 'memorials/show', memorial: @memorial, status: :unprocessable_entity }
format.json { render json: @memory.errors, status: :unprocessable_entity }
end
end
end
So notice that I return a render to the memorial_tab_path.
Since I’m using <%= turbo_refreshes_with method: :morph, scroll: :preserve %> in my layout, this entire experience feels nice very SPA. Invitations are added on the fly, errors are shown without reload.
Am I on the right path?
