I'm trying to allocate an address a custom id so it's not easy to guess the record (for people who want to add and change other people's addresses). For some reason, whilst I can create a record with the correct path being created, the edit path from form_with
seems to be not using the custom resource param.
routes.rb
resources :deladdresses, param: :delid
_form.html.erb
<%= form_with model: deladdress, class: "mt-4" do |f| %>
<%= render "shared/error_messages", resource: f.object %>
.. lots removed for clarity ...
<%= f.hidden_field :country, value: "Australia" %>
<%= f.hidden_field :ordernum, name: :ordernum, value: @order %>
<%= link_to order_path(@order.ordernum) do %>
<button class="btn btn-secondary">Back</button>
<% end %>
<%= f.button "Save", id: 'submit', class: "btn btn-primary" %>
<% end %>
Which is coming from in my new.html.erb
and edit.html.erb
:
<%= render "form", deladdress: @deladdress %>
deladdress.rb
class Deladdress < ApplicationRecord
before_save :add_del_id
belongs_to :user
has_many :orders
def add_del_id
randchars = ("a".."z").to_a.sample(8).join
time = DateTime.now.strftime("%H%M%S")
self.delid = "#{time}-#{randchars.upcase}"
end
end
deladdress_controller.rb
class DeladdressesController < ApplicationController
before_action :find_my_order
def show
# Collect the delivery address for the order
# Do we want to collect and store these per customer?
end
def new
if current_user
@savedaddresses = Deladdress.where(user: current_user)
end
@deladdress = Deladdress.new
end
def edit
@deladdress = Deladdress.where(delid: params[:delid]).first
end
def create
@deladdress = Deladdress.create(deladdress_params)
@deladdress.user = current_user
if @deladdress
@order&.update(deladdress: @deladdress)
redirect_to order_path(@order.ordernum), notice: "Address added"
else
render :new
end
end
def update
@deladdress = Deladdress.where(delid: params[:delid]).first
if @deladdress.update(deladdress_params)
@order.update(deladdress: @deladdress)
redirect_to order_path(@order.ordernum), notice: t(".updated")
else
render :edit
end
end
private
def deladdress_params
attributes = [:first_name, :last_name, :address, :apartment, :city, :state, :country, :postcode, :ordernum, :delid]
params.require(:deladdress).permit(*attributes)
end
def find_my_order
@order = find_order
end
end
When I go to the following url http://localhost:5000/deladdresses/112750-UBTYOJGK/edit
, I can see the delid is there. But, when I look at the form which it is going to try and submit I have the following. The id is 5 and not 112750-UBTYOJGK.
<form class="mt-4" action="/deladdresses/5" accept-charset="UTF-8" data-remote="true" method="post">
<input type="hidden" name="_method" value="patch">
<input type="hidden" name="authenticity_token" value="XXXXXXXXXXXX">
<button name="button" type="submit" id="submit" class="btn btn-primary">Save</button>
</form>
I am obviously missing something but I really don't know what.
Thanks in advance for any help you might be able to give to have this work.
You can pass the url for the form to the form helper like so:
<%= render "form", deladdress: @deladdress, url: deladress_path(@deladress.delid) %>
<%= render "form", deladdress: @deladdress, url: deladresses_path %>
and then in the form itself:
<%= form_with model: deladdress, url: url, class: "mt-4" do |f| %>
...