why is id off by one or defined different in edit vs in update? I will explain what I mean
I have a controller called Bottles and a model Bottle
My config\routes.rb file has the line- resources :bottles
I have this controller
class BottlesController < ApplicationController
def index
end
def show
end
def edit
http://127.0.0.1:3000/bottles/0/edit :id==0
<ActionController::Parameters {“controller”=>“bottles”, “action”=>“edit”, “id”=>“0”} permitted: false>
Bottle.all[0] gives <Bottle id: 1, name: “tod”, size: 234,…>
@bottle=Bottle.all[params[:id].to_i] #:id==0
end
I have these views
C:\rubytest\testoby>type app\views\bottles\new.html.erb
<%= form_for @bottle do |f| %>
<%= f.text_field :name %>
<%= f.text_field :size %>
<%= f.submit “Create” %>
<% end %>
C:\rubytest\testoby>type app\views\bottles\edit.html.erb
<%= form_for @bottle do |f| %>
<%= f.text_field :name %>
<%= f.text_field :size %>
<%= f.submit “Save” %>
<% end %>
C:\rubytest\testoby>
I went to http://127.0.0.1:3000/bottles/new and I made a bottle
name- tod size- 234
I then go to http://127.0.0.1:3000/bottles/0/edit
and I see the bottle there in the form
I then change tod to todd and click ‘save’
here’s the weird thing
I see the URL change to
http://127.0.0.1:3000/bottles/1
but i’d expect it to change to
http://127.0.0.1:3000/bottles/0
I’d expect the form to be submitted to /bottles/0 but it’s not, it’s submitted to /bottles/1
And the params have :id=1
So when it comes to my update, I have to write this line in the controller, subtracting 1 from the id
@abottle=Bottle.all[params[:id].to_i-1]
I can see that there is a difference of definition of :id that one could use… The id in the URL could be either
A)The index in the array e.g. Bottle.all[params[:id]] (Which is what i’ve got for the edit action). or
B) The id attribute of the object, (Which is what i’ve got for the update action @abottle=Bottle.all[params[:id].to_i-1]
One could say, it’s ‘A’, the URL. But then why should the update URL have an :id that is one up from the ID in the edit URL?
Thanks