torstai 30. lokakuuta 2014

Edistyminen haittaa edistymistä

Yritän saada mukaan jonkinlaista mittaria edistymiselle ja tavoitetta kohti etenemiselle. Mittari olkoon numero, ajatellaan sitä vaikka prosenttina. Kun tavoite luodaan, numeron pitäisi alkaa automaattisesti nollasta ja käyttäjä saisi päivittää sitä.

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ä!

Ei kommentteja:

Lähetä kommentti