Model bez tabeli, nie tłumaczy atrybutów

witam
mam model z pewnego tutoriala, do formularza kontaktowego. model nie ma tabeli ale działają walidacje, problem jest taki ze cześć błędu walidacji jest tłumaczona a atrybut nie, czyli np
dostaje błąd ‘Subject nie może być puste’

[code=ruby]class Contact

include ActiveModel::Validations
validates_presence_of :email, :name, :subject, :content, :ip
attr_accessor :id, :email, :name, :subject, :content, :ip

def initialize(attributes = {})
attributes.each do |key, value|
self.send("#{key}=", value)
end
@attributes = attributes
end

def read_attribute_for_validation(key)
@attributes[key]
end

def to_key
end

def save
if self.valid?
ContactMailer.contact_email(self).deliver
return true
end
return false
end

end[/code]
Dodam że ustawienie tych atrybutów w localach w acitverecord.attributes.contact czy activerecord.errors.model.contact nie pomaga. Za to formtastic łapie ustawione locale w formtastic.labels.contact i ustawia prawidło etykiety w formularzu

Potrzebujesz ActiveModel::Translations

Przykładowy prosty model, który zachowuje się już bardzo podobnie do ActiveRecord::Base bez bazy (choć trochę mu jeszcze brakuje ale to może temat na inną prezentację):

Tutaj są linki, gdybyś chciał dowiedzieć się trochę wiecej o ActiveModel:

http://robert.pankowecki.pl/drug.html

chociaż jest to tak prosty i przyjemny kod, że polecam po prostu zaglądnięcie w źródła.

musi być jako moduł czy może być jako klasa ?
próbowałem zrobić identycznie jak tutaj http://railscasts.com/episodes/219-active-model i dalej ten sam problem

Nie rozumiem pytania : “musi być jako moduł czy może być jako klasa ?”

w Twoim kodzie https://github.com/paneq/rails3-active_model-filter-example/blob/master/app/models/smart_model.rb jest to jako moduł a w tym z railscast jako klasa

paneq pokazał Ci fragment modułu, który możesz sobie include’ować w jakiejś Twojej klasie (co by nie powielać tej samej roboty w kilku miejscach).

Dodaj po prostu w swojej klasie

class Contact
 
  include ActiveModel::Validations
  include ActiveModel::Translations

   # (...)

end 

A najlepiej, to skopiuj sobie ten moduł od paneq’a, zapisz katalogu app/models/smart_model.rb i zrób w swojej klasie tak:

[code ruby]
require ‘smart_model’

class Contact

include ::SmartModel

(…)

end[/code]

Chociaż ja osobiście uważam, że lib/ to lepsze miejsce na takie rozszerzenia (pomimo tego, że przykładowej aplikacji i tak dałem to do app/models).

Ale za to w app/models nie wymaga to require i się przeładowywuje.

jest

[code=ruby]class Contact

include ActiveModel::Validations
include ActiveModel::Translation
include ActiveModel::Conversion
extend ActiveModel::Naming
extend ActiveModel::Translation[/code]
i dalej to samo :slight_smile:

Tłumaczenia powinny być w scopie activemodel.* raczej w tym wypadku.

Contact.i18n_scope => “activemodel” pewnie.

Możesz nadpisać tą metodę w tej klasie jeśli chcesz tłumaczyć dla wygody w takim samym scopie jak inne modele.

dzięki. nadpisanie metody klasowej działa super :slight_smile:

Proszę bardzo. +1 dla mnie :slight_smile:

A z zupełnie innej beczki. O ile to co napisałeś było fajne by poćwiczyć sobie activemodel to w prawdziej aplikacji nie stoi za tym żadna korzyść by tych danych nie zapisać na bazie i ja bym to po prostu oparł o ActiveRecord::Base. Chociażby po to by można klientowi zrobić SQL który mu powie: Jak często zwykle osoby próbują się z nami skontaktować w ciągu miesiąca :slight_smile: Takie życiowe, prozaiczne powody.