Ruby on Rails Friday, June 8, 2018

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

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/3e864d52-d02b-4aa4-9839-ba550b472fb0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment