Olen tehnyt applikaationi tekstit tähän asti suoraan suomeksi. Rails tukee applikaation lokalisointia eli koodissa käytetään tekstien "koodinimiä", joille löytyy erikieliset käännökset eri tiedostoista.
Törmäsin käännöksien tarpeellisuuteen, kun lisäsin applikaatioon käyttäjähallinnan devise-gemin avulla, ja se olikin englanninkielinen.
Deviseen oli olemassa käännökset, mutta pitkän ja turhauttavan taistelun jälkeen selvisi, ettei koodeissa ole käytetty näitä tekstien "koodinimiä", joten eiväthän ne käänny vaikka mitä tekisi.
Käännökseen tarvitaan seuraavat:
Gemfile
gem 'rails-i18n'
config\application.rb
class Application < Rails::Application sisälle laitetaan
I18n.config.enforce_available_locales = false
config.i18n.default_locale = :fi
I18n.locale = config.i18n.locale = config.i18n.default_locale
config\locales
yml-tiedostoja:
devise.en.yml
devise.fi.yml
en.yml
fi.yml
Koodissa käännettävä teksti laitetaan esim. näin:
<h2><%= t('devise.passwords.forgot_your_passwd') %></h2>
Silloin käännöstä haetaan locales-hakemiston tiedostoista hierarkiasta
devise:
passwords:
forgot_your_passwd: 'teksti joka siihen tuleekaan'
keskiviikko 11. marraskuuta 2015
perjantai 16. lokakuuta 2015
Projektin julkaisu Openshiftissä
Halusin saada projektini julkaistua näkyville nettiin. Ensimmäinen vaihtoehtoni olisi ollut Heroku, mutta sain vinkin toisesta palvelusta, joka ei heti vaatisi luottokorttia, eli Openshift.
Useiden nettisivujen mukaan pitäisi olla viiden minuutin homma saada Rails-applikaatio vietyä Openshiftiin. Kaksi työpäivää taisteltuani taidan olla nyt voiton puolella. Yritän nyt parhaani mukaan listata kaikki stepit, jotka vaadittiin:
Asensin rhc työkalut.
Loin web consolen kautta uuden Ruby 1.9 -applikaation, johon liitin MySQL 5.5-cartridgen.
Git
Loin omalla koneella uuden tyhjän hakemiston, jonka kai jotenkin liitin Gitillä Openshiftin repositoryyn. Ehkä näin (voi olla että tässä kohdassa vasta loin hakemiston, nyt en ihan muista):
git clone <git_url> <directory to create>
Git url löytyi Openshift web consolesta, pitkä merkkijono joka alkaa ssh://.
Kopioin paikalliset rails-koodini uuteen hakemistoon ja tein git-jutut:
git add .
git commit -m "A checkin to my application"
git remote add openshift <git_url>
git push -f --set-upstream openshift master
Käytin myös pelkkää git push käskyä sekä git push openshift master. En vielä tiedä gitistä tarpeeksi ymmärtääkseni mitä tuli tehtyä.
Git valitti monessa kohdassa että .bundle pitäisi poistaa reposta. Käytin käskyä
git rm --cached -r <mydirectory>
ja laitoin myös sen .gitignore tiedostoon
Gemfile
Lisäsin
gem 'sqlite3', '~> 1.3.11', :group => [:development, :test]
gem 'mysql2', '0.3.18', :group => [:production]
# MultiJson::AdapterError ???
gem 'multi_json', '1.7.8'
gem 'net-ssh', '2.9.2'
Joistakin gemeistä jouduin laittamaan kiinteän versionumeron.
Gemfile.lock
Joidenkin versionumeroiden perään oli generoitu platform-tieto, se piti siivota, vaikkei lock-tiedostoon normaalisti pidä kajota.
database.yml
default: &default
adapter: mysql2
pool: 5
timeout: 5000
development:
<<: *default
adapter: sqlite3
database: db/development.sqlite3
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3
production:
adapter: mysql2
database: "<%=ENV['OPENSHIFT_APP_NAME']%>"
username: "<%=ENV['OPENSHIFT_MYSQL_DB_USERNAME']%>"
password: "<%=ENV['OPENSHIFT_MYSQL_DB_PASSWORD']%>"
host: <%=ENV['OPENSHIFT_MYSQL_DB_HOST']%>
port: <%=ENV['OPENSHIFT_MYSQL_DB_PORT']%>
secrets.yml
Piti luoda salainen avain käskyllä
rake secret
ja laittaa sen arvo ympäristömuuttujaan
rhc set-env SECRET_KEY_BASE=3dc8b0885b3043c0e38aa2e1dc64******************** -a <myapp>
Sitten secrets.yml tiedostoon tuli lisäys
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
config.ru
Sisältö piti muokata tällaiseksi
# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
\.openshift\action_hooks\deploy
#!/bin/bash
pushd ${OPENSHIFT_REPO_DIR} > /dev/null
bundle exec rake db:migrate RAILS_ENV="production"
popd > /dev/null
bundle update
Gemejä piti päivittää tällä käskyllä, että sai production databasen käyttöön:
bundle update --without test development
Tietokanta piti ottaa käyttöön ssh-konsolissa jommalla kummalla käskyllä (riippuu varmaan versioista)
RAILS_ENV=production rake db:setup
bundle exec rake db:setup RAILS_ENV=production
Olin myös sotkenut jotenkin gemien asennushakemiston paikan niin ettei tietokantagemejä enää löytynyt, mutta sain palautettua tilanteen ssh-konsolissa käskyllä
bundle install --system
Lisäyksiä:
1.
Kun applikaation poistaa ja luo uudelleen, vanha git-repository saattaa jotenkin jäädä osoittamaan kuitenkin vanhaan paikkaan. Minulla ongelma näytti siltä, että pystyin luomaan ssh-yhteyden serverille, mutta git push ei toiminut vaan valitti joko salausavaimista tai että repositoryä ei löydy.
Repositoryjen osoitteet näkee ajamalla käskyn
git remote -v
jolloin huomattiin, että osoite oli eri kuin mikä Openshiftin konsolissa näkyi. Se korjattiin näin:
git remote remove origin
git remote add origin ssh://<uusiosoite>
2.
Serveri saattaa herjata näin: You have already activated rack 1.5.2, but your Gemfile requires rack 1.6.4. Tämä johtuu ilmeisesti siitä, että serverillä on jo tuo aiempi rack-versio, kun bundle yrittää asentaa omaansa. (Bugi?) Otin serverille ssh-yhteyden ja ajoin siellä käskyn
gem install rack
jolloin versio päivitti serverin version 1.6.4:ään.
Useiden nettisivujen mukaan pitäisi olla viiden minuutin homma saada Rails-applikaatio vietyä Openshiftiin. Kaksi työpäivää taisteltuani taidan olla nyt voiton puolella. Yritän nyt parhaani mukaan listata kaikki stepit, jotka vaadittiin:
Asensin rhc työkalut.
Loin web consolen kautta uuden Ruby 1.9 -applikaation, johon liitin MySQL 5.5-cartridgen.
Git
Loin omalla koneella uuden tyhjän hakemiston, jonka kai jotenkin liitin Gitillä Openshiftin repositoryyn. Ehkä näin (voi olla että tässä kohdassa vasta loin hakemiston, nyt en ihan muista):
git clone <git_url> <directory to create>
Git url löytyi Openshift web consolesta, pitkä merkkijono joka alkaa ssh://.
Kopioin paikalliset rails-koodini uuteen hakemistoon ja tein git-jutut:
git add .
git commit -m "A checkin to my application"
git remote add openshift <git_url>
git push -f --set-upstream openshift master
Käytin myös pelkkää git push käskyä sekä git push openshift master. En vielä tiedä gitistä tarpeeksi ymmärtääkseni mitä tuli tehtyä.
Git valitti monessa kohdassa että .bundle pitäisi poistaa reposta. Käytin käskyä
git rm --cached -r <mydirectory>
ja laitoin myös sen .gitignore tiedostoon
Gemfile
Lisäsin
gem 'sqlite3', '~> 1.3.11', :group => [:development, :test]
gem 'mysql2', '0.3.18', :group => [:production]
# MultiJson::AdapterError ???
gem 'multi_json', '1.7.8'
gem 'net-ssh', '2.9.2'
Joistakin gemeistä jouduin laittamaan kiinteän versionumeron.
Gemfile.lock
Joidenkin versionumeroiden perään oli generoitu platform-tieto, se piti siivota, vaikkei lock-tiedostoon normaalisti pidä kajota.
database.yml
default: &default
adapter: mysql2
pool: 5
timeout: 5000
development:
<<: *default
adapter: sqlite3
database: db/development.sqlite3
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3
production:
adapter: mysql2
database: "<%=ENV['OPENSHIFT_APP_NAME']%>"
username: "<%=ENV['OPENSHIFT_MYSQL_DB_USERNAME']%>"
password: "<%=ENV['OPENSHIFT_MYSQL_DB_PASSWORD']%>"
host: <%=ENV['OPENSHIFT_MYSQL_DB_HOST']%>
port: <%=ENV['OPENSHIFT_MYSQL_DB_PORT']%>
secrets.yml
Piti luoda salainen avain käskyllä
rake secret
ja laittaa sen arvo ympäristömuuttujaan
rhc set-env SECRET_KEY_BASE=3dc8b0885b3043c0e38aa2e1dc64******************** -a <myapp>
Sitten secrets.yml tiedostoon tuli lisäys
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
config.ru
Sisältö piti muokata tällaiseksi
# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
\.openshift\action_hooks\deploy
#!/bin/bash
pushd ${OPENSHIFT_REPO_DIR} > /dev/null
bundle exec rake db:migrate RAILS_ENV="production"
popd > /dev/null
bundle update
Gemejä piti päivittää tällä käskyllä, että sai production databasen käyttöön:
bundle update --without test development
Tietokanta piti ottaa käyttöön ssh-konsolissa jommalla kummalla käskyllä (riippuu varmaan versioista)
RAILS_ENV=production rake db:setup
bundle exec rake db:setup RAILS_ENV=production
Olin myös sotkenut jotenkin gemien asennushakemiston paikan niin ettei tietokantagemejä enää löytynyt, mutta sain palautettua tilanteen ssh-konsolissa käskyllä
bundle install --system
Lisäyksiä:
1.
Kun applikaation poistaa ja luo uudelleen, vanha git-repository saattaa jotenkin jäädä osoittamaan kuitenkin vanhaan paikkaan. Minulla ongelma näytti siltä, että pystyin luomaan ssh-yhteyden serverille, mutta git push ei toiminut vaan valitti joko salausavaimista tai että repositoryä ei löydy.
Repositoryjen osoitteet näkee ajamalla käskyn
git remote -v
jolloin huomattiin, että osoite oli eri kuin mikä Openshiftin konsolissa näkyi. Se korjattiin näin:
git remote remove origin
git remote add origin ssh://<uusiosoite>
2.
gem install rack
jolloin versio päivitti serverin version 1.6.4:ään.
tiistai 29. syyskuuta 2015
Unicode-merkkien näyttäminen HTML:ssä ja Rails-koodissa
Keksin että voisin Muokkaa ja Poista -tekstien sijaan näyttää sopivan Unicode-merkin. Niillä on omat koodit, jotka toimivat hienosti HTML:n seassa.
<th>✎</th>
<th>❌</th>
Sitten ajattelin, että haluaisin myös jonkin merkin yläreunan navipalkkiin erottamaan sanoja toisistaan.
Alkuperäinen linkki:
<%= link_to 'Projektit', controller: 'projects' %>
Ei toimi:
<%= link_to '✨ Projektit', controller: 'projects' %>
Rails-koodin sisällä oleva & muuttui & -iksi.
Vähän googlailtuani löysin ohjeen käyttää raw-apulaista. Se olikin avulias:
<%= link_to raw('✨ Projektit'), controller: 'projects' %>
<th>✎</th>
<th>❌</th>
Sitten ajattelin, että haluaisin myös jonkin merkin yläreunan navipalkkiin erottamaan sanoja toisistaan.
Alkuperäinen linkki:
<%= link_to 'Projektit', controller: 'projects' %>
Ei toimi:
<%= link_to '✨ Projektit', controller: 'projects' %>
Rails-koodin sisällä oleva & muuttui & -iksi.
Vähän googlailtuani löysin ohjeen käyttää raw-apulaista. Se olikin avulias:
<%= link_to raw('✨ Projektit'), controller: 'projects' %>
Rails meets jQuery: Popup-laatikko
Olen opetellut vähän jQueryn alkeita ja koittanut keksiä, miten voisin kokeilla sitä applikaatiossani. Keksinkin sitten, että sen sijaan että projektilistauksessa (index-sivulla) yhtenä sarakkeena on "kuvaus", kuvausteksti voisi tulla näkyviin, kun käyttäjä laittaa hiiren projektin nimen päälle.
Sen sain aikaan näin:
projects.js
$( document ).ready(function() {
$(this).on('mouseover', '.table-link', function () {
var shortDescBox = $(this).closest('.projecttitle').find('#shortdesc-box');
shortDescBox.text($(this).data('shortdesc'));
shortDescBox.slideDown();
});
$(this).on('mouseleave', '.table-link', function () {
$(this).closest('.projecttitle').find('#shortdesc-box').slideUp();
});
});
index.html.erb
...
<% @projects.each do |project| %>
<tr>
<td class="projecttitle"><%= link_to project.title, project_path(project), :class => "table-link", :'data-shortdesc' => project.description %><div id="shortdesc-box"></div></td>
<td><%= project.goals.count %></td>
...
main.css
#shortdesc-box {
background-color: white;
border: 1px solid black;
position: absolute;
top: 2px;
right: 5px;
font-size: 0.9em;
max-width: 200px;
padding: 10px;
display: none;
z-index: 1;
-moz-border-radius-bottomright: 30px;
-webkit-border-bottom-right-radius: 30px;
border-bottom-right-radius: 30px;
}
Itse jQueryn otin appikseen mukaan näin:
application.html.erb
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
Sen sain aikaan näin:
projects.js
$( document ).ready(function() {
$(this).on('mouseover', '.table-link', function () {
var shortDescBox = $(this).closest('.projecttitle').find('#shortdesc-box');
shortDescBox.text($(this).data('shortdesc'));
shortDescBox.slideDown();
});
$(this).on('mouseleave', '.table-link', function () {
$(this).closest('.projecttitle').find('#shortdesc-box').slideUp();
});
});
index.html.erb
...
<% @projects.each do |project| %>
<tr>
<td class="projecttitle"><%= link_to project.title, project_path(project), :class => "table-link", :'data-shortdesc' => project.description %><div id="shortdesc-box"></div></td>
<td><%= project.goals.count %></td>
...
main.css
#shortdesc-box {
background-color: white;
border: 1px solid black;
position: absolute;
top: 2px;
right: 5px;
font-size: 0.9em;
max-width: 200px;
padding: 10px;
display: none;
z-index: 1;
-moz-border-radius-bottomright: 30px;
-webkit-border-bottom-right-radius: 30px;
border-bottom-right-radius: 30px;
}
Itse jQueryn otin appikseen mukaan näin:
application.html.erb
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
torstai 24. syyskuuta 2015
Kuivaksi puristusta: before_action
Olen palannut näin vuoden tauon jälkeen appiksen pariin. Aloin käydä läpi Rails for Zombies -tutorialia, josta opin heti neljännellä oppitunnilla uuden asian ja aloin soveltaa sitä omaan sovellukseeni.
Model-sivulla olevissa toiminnoissa show, edit jne joudutaan usein tekemään sama asia aluksi, esimerkiksi hakemaan tietokannasta käsiteltävänä oleva asia. Sitä on turha tehdä monta kertaa, vaan Railsissa on rakenne märän koodin kuivaamiseksi (D.R.Y. = Don't Repeat Yourself) eli toiston poistamiseksi.
class TemptasksController < ApplicationController
before_action :get_temptask, only: [:show, :edit, :update, :destroy]
def get_temptask
@temptask = Temptask.find(params[:id])
end
def new
def create
Kaikkien tarvitseman osuuden voi siirtää uuden deffin alle, olen antanut tässä sille nimeksi get_temptask koska se hakee id:n perusteella temptaskin tietokannasta. before_action osaa ajaa tämän ennen joko kaikkia toimintoja tai pelkästään ennen tiettyjä toimintoja kuten tässä.
Model-sivulla olevissa toiminnoissa show, edit jne joudutaan usein tekemään sama asia aluksi, esimerkiksi hakemaan tietokannasta käsiteltävänä oleva asia. Sitä on turha tehdä monta kertaa, vaan Railsissa on rakenne märän koodin kuivaamiseksi (D.R.Y. = Don't Repeat Yourself) eli toiston poistamiseksi.
class TemptasksController < ApplicationController
before_action :get_temptask, only: [:show, :edit, :update, :destroy]
def get_temptask
@temptask = Temptask.find(params[:id])
end
def new
def create
Kaikkien tarvitseman osuuden voi siirtää uuden deffin alle, olen antanut tässä sille nimeksi get_temptask koska se hakee id:n perusteella temptaskin tietokannasta. before_action osaa ajaa tämän ennen joko kaikkia toimintoja tai pelkästään ennen tiettyjä toimintoja kuten tässä.
perjantai 26. joulukuuta 2014
Päivämäärällä pallottelua
Halusin saada mukaan tavoitteisiin aikarajan. Minulla olikin tietokannassa jo sarake targetdate, mutta en ollut käyttänyt sitä vielä mihinkään.
Sain tavoitteen luontiin mukaan aikarajan kyselyn näin:
<%= f.date_select :targetdate, include_blank: true, use_two_digit_numbers: true, start_year: Date.today.year, end_year: Date.today.year + 10, order: [:day, :month, :year] %>
Eräässä ohjeessa luki että ennen attribuuttia (targetdate) olisi pitänyt olla se objekti (goal) mutta niin se ei toiminut.
Tämä apuri osaa tehdä kolme select-valintalaatikkoa, päivälle, kuukaudelle ja vuodelle omansa, ja yhdistää ne itse kokonaiseksi päivämääräksi. Lisämääreitä on paljon, valitsin mahdollisuuden jättää ruudut tyhjäksi, numerot kuunnimien sijasta, näytettävien vuosien määrityksen sekä missä järjestyksessä valikot sivulla ovat.
Kirjoitin Goal-modeliin pari metodia, mutta ne eivät toimineet tai jopa aiheuttivat internal server erroria. Debuggasin ja googletin monta tuntia ja olin aivan tuskastunut kun en keksinyt syytä. Loppujen lopuksi ongelmien juuri oli siinä, että Goal-modelin tiedostomuoto oli väärä! Yritin palauttaa metodista stringiä jossa oli skandi, ja siinä kohdassa se räjähti. Kun muunsin tiedoston UTF-8:ksi, kaikki alkoi toimia.
def relevant_deadline
if (self.targetdate == nil)
return "Ei määräaikaa"
elsif (self.targetdate.year - Date.today.year > 2)
return "Yli 2 v. päästä"
else
return self.targetdate.strftime('%d.%m.%Y')
end
end
Viimeisessä palautuksessa on käytetty päivämäärän formatointia. Se toimi ohjetta soveltaen heittämällä. Mukavaa että joskus niinkin!
Seuraavaksi minua kiinnostaisi ottaa selville vaikkapa miten tavoitteet voisi järjestää targetdaten mukaan.
Sain tavoitteen luontiin mukaan aikarajan kyselyn näin:
<%= f.date_select :targetdate, include_blank: true, use_two_digit_numbers: true, start_year: Date.today.year, end_year: Date.today.year + 10, order: [:day, :month, :year] %>
Eräässä ohjeessa luki että ennen attribuuttia (targetdate) olisi pitänyt olla se objekti (goal) mutta niin se ei toiminut.
Tämä apuri osaa tehdä kolme select-valintalaatikkoa, päivälle, kuukaudelle ja vuodelle omansa, ja yhdistää ne itse kokonaiseksi päivämääräksi. Lisämääreitä on paljon, valitsin mahdollisuuden jättää ruudut tyhjäksi, numerot kuunnimien sijasta, näytettävien vuosien määrityksen sekä missä järjestyksessä valikot sivulla ovat.
Kirjoitin Goal-modeliin pari metodia, mutta ne eivät toimineet tai jopa aiheuttivat internal server erroria. Debuggasin ja googletin monta tuntia ja olin aivan tuskastunut kun en keksinyt syytä. Loppujen lopuksi ongelmien juuri oli siinä, että Goal-modelin tiedostomuoto oli väärä! Yritin palauttaa metodista stringiä jossa oli skandi, ja siinä kohdassa se räjähti. Kun muunsin tiedoston UTF-8:ksi, kaikki alkoi toimia.
def relevant_deadline
if (self.targetdate == nil)
return "Ei määräaikaa"
elsif (self.targetdate.year - Date.today.year > 2)
return "Yli 2 v. päästä"
else
return self.targetdate.strftime('%d.%m.%Y')
end
end
Viimeisessä palautuksessa on käytetty päivämäärän formatointia. Se toimi ohjetta soveltaen heittämällä. Mukavaa että joskus niinkin!
Seuraavaksi minua kiinnostaisi ottaa selville vaikkapa miten tavoitteet voisi järjestää targetdaten mukaan.
maanantai 22. joulukuuta 2014
Sliderin arvo tallentuu muun formin mukana!
Nyt on juhlapäivä! Löysin kuin löysinkin ratkaisun siihen miten javascript sliderin arvo saadaan lähetettyä muun formin mukana ja tallennettua tietokantaan.
Edelliseen postaukseen lisää tuli tämä:
goals.js
function setSliderColor() {
...
$( "#slaideriteksti" ).text( progress );
$( "#edistys").val(progress);
.erb
<div id="slaideri"></div>
<%= f.hidden_field :progress, :id => "edistys" %>
(<span id="slaideriteksti"></span>)
:) :) :) \o/
Edelliseen postaukseen lisää tuli tämä:
goals.js
function setSliderColor() {
...
$( "#slaideriteksti" ).text( progress );
$( "#edistys").val(progress);
.erb
<div id="slaideri"></div>
<%= f.hidden_field :progress, :id => "edistys" %>
(<span id="slaideriteksti"></span>)
:) :) :) \o/
Tilaa:
Blogitekstit (Atom)


