Vediamo come creare una semplicissima app per facebook in Rails che stampa ‘Hello NOME_UTETE_FACEBOOK COGNOME_UTETE_FACEBOOK’
Per prima cosa installiamo la gemma facebooker
sudo gem install facebooker
Poi creiamo un’app vuota
rails myfaceapp
e il plugin facebooker per rails
./script/plugin install git://github.com/mmangino/facebooker.git
Ok creiamo un controller, per esempio ciccio con la vista index
script/generate controller ciccio index
Modifichiamo subito il file app/controllers/application_controller.rb aggiungendo
ensure_application_is_installed_by_facebook_user
filter_parameter_logging :fb_sig_friends
A questo punto andiamo a modificare l’azione index nel controller ciccio (file app/controllers/ciccio_controller.rb)
def index
@firstName = facebook_session.user.first_name
@lastName = facebook_session.user.last_name
end
Infine editiamo la vista dell’azione index app/views/ciccio/index.html.erb
Hello <%= @firstName %> <%= @lastName %>!
Bene. Ora la nostra app e` quasi pronta…
Ora dobbiamo configurarla er in facebook. Andiamo all’indirizzo http://www.facebook.com/developers/apps.php e creiamo una nuova app (Imposta Nuova Applicazione). Inseriamo il nome dell’app e accettiamo la licenza. Andiamo poi sul tab ‘Modelli’ (Canvas) e inseriamo Canvas page URL con mytestapp e Canvas Callback URL con http://localhost:3000/ciccio/index/. Salviamo le modifiche.
A questo punto l’ultimo passo: copiamo la Chiave API e la Secret Key (Applicazione Nascosta). Ora nella nosta app rails creiamo il file app/config/facebooker.yml come segue:
development:
api_key: API_KEY_APPENA_COPIATA
secret_key: SECRET_KEY_APPENA_COPIATA
pretty_errors: true
set_asset_host_to_callback_url: true
test:
api_key: API_KEY_APPENA_COPIATA
secret_key: SECRET_KEY_APPENA_COPIATA
pretty_errors: true
set_asset_host_to_callback_url: true
production:
api_key: API_KEY_APPENA_COPIATA
secret_key: SECRET_KEY_APPENA_COPIATA
pretty_errors: true
set_asset_host_to_callback_url: true
Avviamo la nostra app con ./script/server e testiamola all’indirizzo http://apps.facebook.com/mytestapp/
Globalize2 (fantastico plugin per Ruby on Rails per globalizzare la nostra applicazione [tradurre il contenuti nel DB]) ritorna nil se non trova una traduzione per un campo del DB.
Questo in molti casi e` un pacco e sarebbe bello che ritornasse il valore del locale di default.
Per fare cio` andiamo ad modificare globalize2.
Prendiamo il file in globalize2/lib/globalize/active_record/adapter.rb
Andiamo alla funzione def fetch_attribute(locale, attr_name) linea 53
def fetch_attribute(locale, attr_name)
translations = fetch_translations(locale)
value, requested_locale = nil, locale
Globalize.fallbacks(locale).each do |fallback|
translation = translations.detect { |t| t.locale == fallback }
value = translation && translation.send(attr_name)
locale = fallback && break if value
end
set_metadata(value, :locale => locale, :requested_locale => requested_locale)
value
end
Modifichiamo dopo set_metadata:
def fetch_attribute(locale, attr_name)
translations = fetch_translations(locale)
value, requested_locale = nil, locale
Globalize.fallbacks(locale).each do |fallback|
translation = translations.detect { |t| t.locale == fallback }
value = translation && translation.send(attr_name)
locale = fallback && break if value
end
set_metadata(value, :locale => locale, :requested_locale => requested_locale)
value = fetch_attribute(I18n.default_locale, attr_name) if value.nil? && locale != I18n.default_locale # ADDED BY PIOZ
value
end
In questo modo se value e` nil ricalcolera` value con il locale di default.
Vediamo come inviare una mail con allegato usando l’API di Ruby per SMTP. Di seguito il codice:
def send_newsletter
body = "Testo del messaggio"
filecontent = File.read("allegato.pdf")
encodedcontent = [filecontent].pack("m") # base64
marker = "AUNIQUEMARKER"
# Define the main headers.
part1 =<<EOF
From: from@mail.com <Pioz>
To: <to@mail.it>
Subject: Oggetto del messaggio
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=#{marker}
--#{marker}
EOF
# Define the message action
part2 =<<EOF
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding:8bit
#{body}
--#{marker}
EOF
# Define the attachment section
part3 =<<EOF
Content-Type: application/pdf; name="allegato.pdf"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename="allegato.pdf"
#{encodedcontent}
--#{marker}--
EOF
mailtext = part1 + part2 + part3
Net::SMTP.start('mail.server.it', 25, 'mail.server.it', USERNAME, PASSWORD, :login) do |smtp|
smtp.send_message mailtext, "from@mail.com", "to@mail.it"
end
end
Ecco.. in pratica inviamo una mail in multipart divisa in tre parti: una per dire che e` multipart, una per il body della mail (formato HTML nell’esempio) e l’ultima per l’allegato.
Beh, renderizziamo un rjs direttamente dal controller… easy:
def index
@polli = Polli.all
render(:update) { |page| page.alert('Yeah') }
end