Ensimmäinen haasteeni oli saada tavoitteenluontilomakkeeseen piilokenttä välittämään nolla controllerille. Lisäsin lomakkeeseen seuraavan rivin:
<%= hidden_field_tag 'progress', 0 %>
Näin sain aikaan html-koodin
<input id="progress" name="progress" type="hidden" value="0" />
kuten pitikin. Sitten tulikin tenkkapoo. Lomakkeeni kyllä lähetti hienosti progress-muuttujan, mutta controller ei tallentanut sitä tietokantaan.
Started POST "/projects/5/goals" for 127.0.0.1 at 2014-10-30 12:56:05 +0200
Processing by GoalsController#create as HTML
Parameters: {"utf8"=>"V", "authenticity_token"=>"JFtUcbAFJiAs8y08trBS/y/KqmrlIOsfrkppFAqwabE=", "goal"=>{"title"=>"Tavoite1", "description"=>"Kuvaus1", "celebration"=>"Juhlistus1"}, "progress"=>"0",
"commit"=>"Luo tavoite", "project_id"=>"5"}
DEBUG params inspect {"utf8"=>"V", "authenticity_token"=>"JFtUcbAFJiAs8y08trBS/y/KqmrlIOsfrkppFAqwabE=", "goal"=>{"title"=>"Tavoite1", "description"=>"Kuvaus1", "celebration"=>"Juhlistus1"}, "progress"=>"0", "commit"=>"Luo tavoite", "action"=>"create", "controller"=>"goals", "project_id"=>"5"}
←[1m←[36mProject Load (0.0ms)←[0m ←[1mSELECT "projects".* FROM "projects" WHERE "projects"."id" = ? LIMIT 1←[0m [["id", 5]]
←[1m←[35m (0.0ms)←[0m begin transaction
←[1m←[36mSQL (1.0ms)←[0m ←[1mINSERT INTO "goals" ("celebration", "created_at", "description", "project_id", "title", "updated_at") VALUES (?, ?, ?, ?, ?, ?)←[0m [["celebration", "Juhlistus1"], ["created_at", "2014-10-30 10:56:05.533493"], ["description", "Kuvaus1"], ["project_id", 5], ["title", "Tavoite1"], ["updated_at", "2014-10-30 10:56:05.533493"]]
←[1m←[35m (108.8ms)←[0m commit transaction
←[1m←[36m (0.0ms)←[0m ←[1mbegin transaction←[0m
←[1m←[35m (0.0ms)←[0m commit transaction
←[1m←[36mProject Load (1.0ms)←[0m ←[1mSELECT "projects".* FROM "projects" WHERE "projects"."id" = ? LIMIT 1←[0m [["id", 5]]
Redirected to http://localhost:3000/projects/5
Completed 302 Found in 118ms (ActiveRecord: 110.8ms)
Tarkistin sen vielä konsolin kautta hakemalla kaikki tavoitteet tietokannasta.
irb(main):002:0> Goal.all
<snip>
#<Goal id: 13, title: "Tavoite1", description: "Kuvaus1", project_id: 5, created_at: "2014-10-30 10:56:05", updated_at: "2014-10-30 10:56:05", celebration: "Juhlistus1", progress: nil>]>
Ensin virhe oli ollut siinä, että en ollut sallinut progress-muuttujan tallentamista controllerin turvaosuudessa:
private
def goal_params
params.require(:goal).permit(:title, :description, :celebration, :progress)
end
Mutta syytä oli vielä jossain muuallakin. Mikä kummempaa, edistysnumeron päivitys onnistui olemassaolevaan tavoitteeseen mutta ei sen asettaminen nollaksi tavoitetta luodessa.
Googlailun jälkeen näytti siltä että en voi käyttää hidden_field_tagia, koska se ei ole jotenkin yhteydessä modeliin eli tietokantaan. Siitä seurasikin seuraava tenkkapoo. Mikä on hidden_fieldin oikea formaatti? Katsokaapa nimittäin tätä keskustelua: http://stackoverflow.com/questions/6636875/rails-hidden-field-undefined-method-merge-error
<%= f.hidden_field :service, "test" %>
<%= f.hidden_field :service, :value => "test" %>
<%= f.hidden_field :service %>
<%= f.hidden_field :service, value: "test" %>
Mitä näistä kuuluu käyttää? Dokumentaatiosta ei ole kovasti apua:
Examples
hidden_field(:signup, :pass_confirm)
<input type="hidden" id="signup_pass_confirm" name="signup[pass_confirm]" value="#{@signup.pass_confirm}" />
Mikä ihme tuo härpäke tuossa value-kohdassa on? Jos haluan vain arvoksi vaikka 0, miten saan sen siihen?
Ei auta kuin kokeilla.
<%= f.hidden_field :progress, '0' %>
undefined method `merge' for "0":String
<%= f.hidden_field :progress, :value =>'0' %>
<input id="goal_progress" name="goal[progress]" type="hidden" value="0" />
Jes! Nyt näyttää hyvältä!
