Является ли sprintf несовместимым с sinatra? - PullRequest
2 голосов
/ 07 октября 2011

Скажите, у меня есть это:

class Account
  ...
  property :charge, Decimal, :precision => 7, :scale => 2
  ...
  classy stuff
  ...

  def self.balance(prefix)
    x = Account.get(prefix.to_sym).order(:fields => [:charge]).sum(:charge)
    sprintf("%5.2f", x)
  end
end

(Редактировать: Значение всех полей начислений равно 0,13E2 (0,1E2 + 0,3E1). Это возвращено правильно. Только в представлении это выглядит как sprintf)

В IRB Account.balance(:AAA) возвращает => "13.00"

если я позвоню Account.balance(:AAA) из представления, я получу TypeError в / account не может конвертировать ноль в число с плавающей точкой

Account.balance(:AAA) работает везде, где я его называю , кроме в представлении. Если я уберу sprintf("%5.2f", x), я получу 0.13E2 на мой взгляд. (использование Account.balance(:AAA).to_f в представлении дает мне 13.0)

Синатра несовместима с sprintf? или я не понимаю, как использовать sprintf?

(Изменить: Это оскорбительный вид:)

<section>
  <% @accounts.each do |account| %>
    <article>
      <h2><%= account.prefix %></h2>
      <span><p>This account belongs to <%= account.name %> & has a balance of $<%= Account.balance(account.prefix) %>.</p></span>
    </article>
  <% end %>
</section> 

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Не имеет ли смысла определять balance как метод экземпляра, а не как метод класса?Как видно из вашего примера, вы все равно звоните balance * account, так почему бы не сделать это:

# the model

class Account
  #...

  def balance
    amount = self.order(:fields => [:charge]).sum(:charge)
    sprintf "%5.2f", amount

    # or the infix version:
    "%5.2f" % amount
  end
end

,

# the view

...balance of $<%= account.balance %>...

Я знаючто это само по себе не решает sprintf, но проблема, скорее всего, будет вызвана немного запутанным поиском, чем встроенным методом.Даже если мой конкретный код не подходит для вашего приложения, возможно, стоит упростить этап поиска, даже если он включает в себя еще несколько строк кода.

Преимущество этого подхода состоит в том, что нет сомнений в том, чтоВы получите правильную запись Account.

1 голос
/ 07 октября 2011

протестировал его с небольшим приложением sinatra, и оно заработало для меня

app.rb

#!/usr/bin/env ruby

require 'rubygems'
require 'sinatra'

get '/' do
  @x = 10.23
  erb :index
end

вид / index.erb

<%= sprintf("%5.2f", @x) %>

выход:

10.23

Рубин 1.9.2 / Синатра 1.3.1

Я думаю, что перед sprintf есть еще одна ошибка из-за вашего сообщения об ошибке:

can't convert nil into Float

кажется, что твой ноль ноль. постарайтесь убедиться, что x не равен nil, тогда sprintf должен работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...