Witam
Czy jest jakiś sposób, żeby zmusić Railsy do stosowania polskich formatów liczb?
Wyświetlanie nie jest problemem, number_to_currency z odpowiednimi parametrami wyświetla wszystko tak jak trzeba.
Problem jest przy formularzach do wprowadzania wartości pieniężnych.
number_field chce wartości podawanych z “.” zamiast “,”.
Przyznam, że dopiero zaczynam poznawanie railsów i może czegoś jeszcze nie doczytałem, ale z obecnie posiadanej wiedzy before_validate jest wykonywane po stronie serwera, czyli po przesłaniu formularza.
Nie widzę możliwości wykorzystania tego przy wyświetlaniu formularza do edycji, być może źle patrze
Przy nowym rekordzie:
Formularz -> input field (wpisana przez użytkownika wartość: 123,45)-> before_validate lub before_save -> wartość: 123.45 -> zapis do bazy
before_vallidate lub before_safe zamienia “,” na “.” dla kolumny decimal lub usuwa “,” dla kolumny integer
Przy edycji:
Odczyt z bazy -> wartość: 123.45 -> tu_właśnie_jest_problem -> input field (wartość: 123,45) -> formularz
tu_właśnie_jest_problem powinien zamienić “.” na “,” dla decimal lub wstawić “,” przed dwoma ostatnimi cyframi dla integer
[quote=gotar]def edit
@model = Model.find[:id]
@mode.price.gsub!(',','.')
end
i po sprawie[/quote]
Przecież ten przecinek czy kropka to tylko warstwa widoku, więc po co zmieniać zawartość zmiennej.
Pisałeś w pierwszym poście, że przy wyświetlaniu możesz skorzystać z number_to_currency, więc w czym problem?
Ew. tak jak napisał Piotr powyżej, nadpisać getter (ale wtedy otrzymujemy string zamiast inta/floata, więc może być potem problem z jakimiś działaniami arytmetycznymi na nim)
Działania arytmetyczne będą mi potrzebne, więc wolałbym zostawić to tak jak jest.
Chodzi tylko o wyświetlenie liczby z przecinkiem w polach do wprowadzania ceny przy edycji i możliwość wpisania liczb z przecinkiem a nie z kropką.
<%= f.label :amount %><br />
<%= f.text_field :amount, :size => 5, :value => number_to_currency(@amount) %>
(oczywiście zamiast @amount podstawiasz to co tam wykorzystujesz, @object.amount czy coś takiego, chyba f.object.amount zadziała, ale nie sprawdzałem)
class Check < ActiveRecord::Base
belongs_to :transaction
include I18n::Alchemy[/code]
W kontrolerze obiektu User dla akcji show, i edit dodałem
@transaction.checks.collect! { |c| c.localized }
Efekt jest taki, że przy edycji pola formularza uzupełniane są prawidłowo, tj. z przecinkiem
Zapisanie formularza z liczbami z przecinkiem działa poprawnie.
Problem jest przy tworzeniu nowego obiektu transaction.
def create
@transaction = Transaction.new(params[:transaction])
....
w params[:transaction] przekazywana jest prawidłowa wartość amount np. (129,99).
@transaction.checks.each { |c| c.amount }
=> 129.0
wywołanie metody localized (tak jak w przypadku edit) na obiektach @transaction.checks jest bez sensu po utworzeniu obiektu @transaction.
Jedyne co mi przychodzi do głowy, zamiana metody @transaction.new na taką, która przy wywołaniu najpierw stworzy check, wywoła na nim check.localized, a później załaduje dane z formularza.
Dobrze myślę, czy są jakieś prostsze sposoby?