Instrukcja Case w Ruby sinatra

0

Witam wszystkich,
Piszę kalkulator bmi w ruby w sinatrze i mam problem.
Nie wiem jak osadzić instrukcje case w sinatrze/ruby
Aby wyświetlił mi się i wynik new amount oraz wynik z instrukcji case:

#calculate.erb

<div class="alert alert-info" role="alert">
  <p> Twoje BMI wynosi <strong><%= new_amount %></strong>.</p>
</div>
<% case new_amount
when 16.0
wygłodzenie
when 16.0..16.99
wychudzenie (spowodowane często przez anoreksję lub inną ciężką chorobę
when 17.0..18.49
niedowaga
when 18.5..24.99
wartość prawidłowa
when 25.0..29.99
nadwaga
when 30.0..34.99
stopień otyłości
when 35.0..39.99
II stopień otyłości (otyłość kliniczna)
when 40.0
III stopień otyłości (otyłość skrajna) %>
<% end %>

#index.erb

<form action="/calculate" method="post">
  <div class="form-group">
    <label for="wzrost">Wzrost</label>
    <input name="wzrost" type="text" class="form-control" placeholder="Wpisz swój wzrost w CM" id="wzrost">
  </div>

  <div class="form-group">
    <label for="waga">Waga</label>
    <input name="waga" type="text" class="form-control" placeholder="Wpisz swoją wagę w KG" id="waga">
  </div>

  <button type="sumbit" class="btn btn-primary">Oblicz BMI</button>
</form>

#layout.erb

<!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Kalkulator BMI</title>
  </head>
  <body>
    
    <div class="container">
      <h1><p>Witaj w kalkulatorze BMI!</p></h1>
      <%= yield %>
    </div>
  </body>
</html>

#28.rb

require 'sinatra'
require 'sinatra/reloader'

get '/' do
  erb :index
end
post '/calculate' do
  wzrost = params["wzrost"].to_f
  waga = params["waga"].to_f
  new_amount = waga / (wzrost*wzrost)*10000

  erb :calculate, locals: {new_amount: new_amount}
end

error:

SyntaxError at /calculate
/home/piotr/Karol/mine/w sinatrze /views/calculate.erb:9: syntax error, unexpected keyword_when, expecting ')' when 17.0..18.49 ^



0

Ruby nie ma gołych stringów.

0
hauleth napisał(a):

Ruby nie ma gołych stringów.
w sensie dodać puts tylko?

0

Stringi są tej postaci: "tekst".

0

W skrócie cały ten fragment jest zły:

<% case new_amount
when 16.0
wygłodzenie
when 16.0..16.99
wychudzenie (spowodowane często przez anoreksję lub inną ciężką chorobę
when 17.0..18.49
niedowaga
when 18.5..24.99
wartość prawidłowa
when 25.0..29.99
nadwaga
when 30.0..34.99
stopień otyłości
when 35.0..39.99
II stopień otyłości (otyłość kliniczna)
when 40.0
III stopień otyłości (otyłość skrajna) %>
<% end %>

Coyote nie ma kolorowanie dla ERB, więc usuńmy tagi w wklejmy to jako Ruby:

case new_amount
when 16.0
wygłodzenie
when 16.0..16.99
wychudzenie (spowodowane często przez anoreksję lub inną ciężką chorobę
when 17.0..18.49
niedowaga
when 18.5..24.99
wartość prawidłowa
when 25.0..29.99
nadwaga
when 30.0..34.99
stopień otyłości
when 35.0..39.99
II stopień otyłości (otyłość kliniczna)
when 40.0
III stopień otyłości (otyłość skrajna)
end

To jest dokładnie to samo co widzi interpreter. Widzisz problem? Masz tzw. "bare strings" zamiast normalnych stringów. Powinno być (cały czas pomijając wcięcia, które powinieneś jednak porobić):

case new_amount
when 16.0
"wygłodzenie"
when 16.0..16.99
"wychudzenie (spowodowane często przez anoreksję lub inną ciężką chorobę"
when 17.0..18.49
"niedowaga"
when 18.5..24.99
"wartość prawidłowa"
when 25.0..29.99
"nadwaga"
when 30.0..34.99
"stopień otyłości"
when 35.0..39.99
"II stopień otyłości (otyłość kliniczna)"
when 40.0
"III stopień otyłości (otyłość skrajna)"
end

W ERB wyglądałoby to tak:

<% case new_amount
when 16.0 %>
wygłodzenie
<% when 16.0..16.99 %>
wychudzenie (spowodowane często przez anoreksję lub inną ciężką chorobę
<% when 17.0..18.49 %>
niedowaga
<% when 18.5..24.99 %>
wartość prawidłowa
<% when 25.0..29.99 %>
nadwaga
<% when 30.0..34.99 %>
I stopień otyłości
<% when 35.0..39.99 %>
II stopień otyłości (otyłość kliniczna)
<% when 40.0 %>
III stopień otyłości (otyłość skrajna)
<% end %>

Jednak dalej największym błędem jest fakt, że to w ogóle znalazło się w widoku. Zamiast tego powinieneś mieć jakiegoś prezentera/helpera/view_model, który generowałby dany string. Bo jak inaczej przetestujesz czy zwracasz dobre wartości? Będziesz generował cały widok tylko by sprawdzić jednego case? Zamockujesz się na śmierć.

Ogólnie najlepszy sposób na napisanie tego to:

module BMI
  INDEX = {
    0...16.0 => 'wygłodzenie',
    16.0...17.0 => 'wychudzenie',
    17.0...18.5 => 'niedowaga',
    18.5...25.0 => 'w normie',
    25.0...30.0 => 'nadwaga',
    30.0...35.0 => 'I stopień otyłości',
    35.0...40.0 => 'II stopień otyłości',
    40.0...(1.0 / 0.0) => 'III stopień otyłości'
  }.freeze

  def self.calculate(height, weight)
    weight / height**2
  end

  def self.string(height, weight)
    bmi = calculate(height, weight)

    INDEX.select { |range| range.include?(bmi) }.values.last
  end
end

I teraz zamiast bawić się w jakieś liczenie w kontrolerze czy pierdoły z wyświetlaniem w widoku (czyli 2 najgorsze rzeczy jakie można zrobić w MVC) masz proste BMI.string(height, weight).

1 użytkowników online, w tym zalogowanych: 0, gości: 1