<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mocna Kawa &#187; Ruby on Rails</title>
	<atom:link href="http://blog.mocna-kawa.com/category/ruby-on-rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mocna-kawa.com</link>
	<description>radosny blog o nowych technologiach</description>
	<lastBuildDate>Tue, 24 Aug 2010 08:47:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JRuby #03 &#8211; Czas pobawić się z Ruby on Rails</title>
		<link>http://blog.mocna-kawa.com/2008/10/jruby-03-czas-pobawic-sie-z-ruby-on-rails/</link>
		<comments>http://blog.mocna-kawa.com/2008/10/jruby-03-czas-pobawic-sie-z-ruby-on-rails/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 23:21:31 +0000</pubDate>
		<dc:creator>wiktor</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.mocna-kawa.com/?p=95</guid>
		<description><![CDATA[
W poprzednich dwóch artykułach pokazałem jak zainstalować JRubiego oraz jak może Ruby z Javą rozmawiać. Czas rozpocząć przygodę z JRuby on Rails.
W tym artykule pokażę: 

jak stworzyć prostą aplikację typu CRUD w Ruby on Rails, która będzie korzystać z bazy danych MySQL,
jak wdrożyć tą aplikację na serwerze Tomcat przy użyciu narzędzia Warbler.

Wymagania. Zakładam, że masz [...]]]></description>
			<content:encoded><![CDATA[<p class="center"><img class="alignnone size-full wp-image-96" title="jruby-03-jruby-on-rails" src="http://wiktorgworek.com/blogtest/wp-content/uploads/2008/10/jruby-03-jruby-on-rails.png" alt="JRuby on Rails" width="500" height="125" /></p>
<p>W poprzednich dwóch artykułach pokazałem jak <a href="http://blog.mocna-kawa.com/2008/04/29/jruby-01-jak-zainstalowac-zeby-sie-pobawic/">zainstalować JRubiego</a> oraz <a href="http://blog.mocna-kawa.com/2008/05/09/jruby-02-ruby-rozmawia-z-java-java-rozmawia-z-rubyim/">jak może Ruby z Javą rozmawiać</a>. Czas rozpocząć przygodę z JRuby on Rails.</p>
<p>W tym artykule pokażę: </p>
<ul>
<li>jak stworzyć prostą aplikację typu <a href="http://pl.wikipedia.org/wiki/CRUD">CRUD</a> w Ruby on Rails, która będzie korzystać z bazy danych MySQL,</li>
<li>jak wdrożyć tą aplikację na serwerze <a href="http://tomcat.apache.org">Tomcat</a> przy użyciu narzędzia <a href="http://caldersphere.rubyforge.org/warbler/">Warbler</a>.</li>
</ul>
<p><em>Wymagania.</em> Zakładam, że masz już zainstalowaną bazę danych MySQL 5.0.x. Potrzebny będzie także serwer Tomcat, który można <a href="http://tomcat.apache.org/download-60.cgi">stąd</a> pobrać (w chwili pisania korzystałem z najnowszej wersji 6.0.18). Jeśli nie masz jeszcze zainstalowanego Ruby on Rails to wykonaj następujące polecenie:</p>

<div class="wp_codebox"><table><tr id="p953"><td class="code" id="p95code3"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Na wszelki wypadek Ruby on Rails przyda się :)</span>
$ jruby <span style="color: #660033;">-S</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> rails warbler jruby-openssl <span style="color: #660033;">--no-ri</span> <span style="color: #660033;">--no-rdoc</span></pre></td></tr></table></div>

<h4>Stworzenie prostej aplikacji</h4>
<p>Czas napisać prostą aplikację. Jej funkcjonalność ograniczy się do dodawania, edytowania i usuwania wiadomości (dużo powiedziane, bo wiadomość będzie się składać tylko z łańcucha znaków <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Zaczynamy.</p>

<div class="wp_codebox"><table><tr id="p954"><td class="code" id="p95code4"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Stworzenie szkieletu aplikacji</span>
$ jruby <span style="color: #660033;">-S</span> rails rails_app
$ <span style="color: #7a0874; font-weight: bold;">cd</span> rails_app<span style="color: #000000; font-weight: bold;">/</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Stworzenie modelu wiadomości oraz operacji CRUD dla niego</span>
$ jruby <span style="color: #660033;">-S</span> script<span style="color: #000000; font-weight: bold;">/</span>generate scaffold message content:string
&nbsp;
<span style="color: #666666; font-style: italic;"># i pozostaje konfiguracja dostępu do bazy danych - tego Rails jeszcze nie potrafią same zrobić :)</span>
$ <span style="color: #c20cb9; font-weight: bold;">vim</span> config<span style="color: #000000; font-weight: bold;">/</span>database.yml</pre></td></tr></table></div>

<p>Moją konfigurację można zobaczyć poniżej. Nie należy zapomnieć stworzyć bazy danych w MySQLu (wystarczy tylko <code>railsapp_development</code>).</p>
<pre>defaults: &amp;defaults
    adapter: mysql
    username: root
    password:
    host: localhost
    encoding: utf8

development:
  database: railsapp_development
  &lt;&lt;: *defaults

test:
  database: railsapp_test
  &lt;&lt;: *defaults

production:
  database: railsapp_production
  &lt;&lt;: *defaults</pre>
<p>Aplikacja już napisana, baza danych skonfigurowana. Zostało jeszcze utworzenie odpowiednich tabelek w bazie danych i można już bawić się aplikacją.</p>
<p>[Bash]<br />
# Jeśli nie było żadnego błędu po drodze to poniższa operacja powinna wykonać poprawnie<br />
$ jruby -S rake db:migrate<br />
(in /Users/wiktor/jruby/rails_app)<br />
== 20081028224846 CreateMessages: migrating ===================================<br />
&#8211; create_table(:messages)<br />
-&gt; 0.0049s<br />
== 20081028224846 CreateMessages: migrated (0.0058s) ==========================<br />
[/Bash]</p>
<p>Aplikację można już uruchomić poleceniem <code>jruby -S script/server</code>. Po wejściu na stronę <a href="http://localhost:3000">http://localhost:3000</a> można zobaczyć środowisko uruchomienia aplikacji, a pod adresem <a href="http://localhost:3000/messages">http://localhost:3000/messages</a> znajduje się przed chwilą stworzona, bardzo wyrafinowana aplikacja.</p>
<p class="center"><img class="alignnone size-medium wp-image-97" title="rails-on-java" src="http://blog.mocna-kawa.com/wp-content/uploads/2008/10/rails-on-java-300x264.png" alt="Rails on Java" width="300" height="264" /></p>
<h4>Wdrożenie Ruby on Rails na Tomcata</h4>
<p>Żeby przygotować aplikacje Ruby on Rails do wdrożenia ją na Tomcata, należy użyć biblioteki Warbler. Została ona już zainstalowana poleceniem <code>jruby -S gem install ... </code> na samym początku artykułu.</p>
<p>Przez dłuższy czas obserwowałem rozwój Warblera. Kiedy projekt stawiał pierwsze kroki, przygotowanie aplikacji Ruby on Rails wiązało się ze starannym przygotowaniem pliku konfiguracyjnego, zadbaniem o odpowiednie sterowniki JDBC do bazy danych. Nie było to miłe zajęcie. Z tego powodu warto docenić, że obecnie przygotowanie aplikacji do wdrożenia na Tomcacie jest banalnie proste.</p>
<p>[Bash]<br />
# Stworzenie pliku config/warble.rb.<br />
$ jruby -S warble config</p>
<p># Teraz należy w pliku config/warble.rb zamienić linijkę<br />
#   z   # config.webxml.rails.env = ENV['RAILS_ENV'] || &#8216;production&#8217;<br />
#   na  config.webxml.rails.env = &#8216;development&#8217;</p>
<p># Przygotowanie aplikacji w postaci WAR.<br />
$ jruby -S warble war<br />
jar cf rails_app.war -C tmp/war .</p>
<p># Gotowe?<br />
$ ls -l rails_app.war<br />
-rw-r&#8211;r&#8211;  1 wiktor  wiktor  9800493 Oct 29 23:28 rails_app.war</p>
<p># Mając już Tomcata uruchomionego możemy wdrożyć aplikację.<br />
$ cp rails_app.war ../apache-tomcat-6.0.18/webapps/<br />
[/Bash]</p>
<p>Aplikacja będzie dostępna pod adresem <a href="http://localhost:8080/rails_app">http://localhost:8080/rails_app</a>, a bawić wiadomościami można się tutaj: <a href="http://localhost:8080/rails_app/messages">http://localhost:8080/rails_app/messages</a>.</p>
<p>Parę słów wyjaśnienia. Standardowo Warbler uruchamia aplikację w trybie produkcji. Jednym ze skutków jest to, że aplikacja będzie korzystać z bazy <code>railsapp_production</code>, a nie z <code>railsapp_development</code>, której do tej pory używaliśmy. Zmiana podyktowana była jedynie moją leniwością.</p>
<p>Warto też zauważyć, że cała aplikacja <code>rails_app.war</code> waży niecałe 10 MB. Co się tam znajduje? Otóż cała dystrybucja JRubiego, a także wszystkie zależności Ruby on Rails. Takie życie <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Zachęcam także do przestudiowania pliku <code>config/warble.rb</code>, poprzez który można konfigurować zachowanie aplikacji na serwerze Javowym.</p>
<p>Smacznego <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mocna-kawa.com/2008/10/jruby-03-czas-pobawic-sie-z-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Prezentacja JRuby on Rails na bis w Krakowie</title>
		<link>http://blog.mocna-kawa.com/2008/04/prezentacja-jruby-on-rails-na-bis-w-krakowie/</link>
		<comments>http://blog.mocna-kawa.com/2008/04/prezentacja-jruby-on-rails-na-bis-w-krakowie/#comments</comments>
		<pubDate>Sat, 19 Apr 2008 14:13:22 +0000</pubDate>
		<dc:creator>wiktor</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[swing]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[jug]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.mocna-kawa.com/?p=74</guid>
		<description><![CDATA[
Już w najbliższy czwartek będę w Krakowie dawał prezentację o JRuby&#8217;im w ramach PJUG. Szczegóły wydarzenia tutaj. Gdzie, o której?


24 kwietnia 2008 (czwartek), godz. 19:00 &#8211; 20:30
Akademia Górniczo-Hutnicza
Al. Mickiewicza 30, sala 429 C2


Czego można się spodziewać? Będzie to odświeżona wersja mojego show o JRuby&#8217;im (prezentacja i prawdziwe kodowanie na żywo), które debiutowało podczas WarsJava&#8217;07. Przez [...]]]></description>
			<content:encoded><![CDATA[<p>
Już w najbliższy czwartek będę w Krakowie dawał prezentację o JRuby&#8217;im w ramach <a href="http://java.pl">PJUG</a>. Szczegóły wydarzenia <a href="http://www.java.pl/?p=48">tutaj</a>. Gdzie, o której?
</p>
<blockquote><p>
<strong>24 kwietnia 2008 (czwartek), godz. 19:00 &#8211; 20:30</strong><br />
Akademia Górniczo-Hutnicza<br />
Al. Mickiewicza 30, sala 429 C2
</p></blockquote>
<p>
<strong>Czego można się spodziewać?</strong> Będzie to odświeżona wersja mojego <a href="http://blog.mocna-kawa.com/2007/11/18/notatki-z-warsztatu-jruby-on-rails/">show o JRuby&#8217;im</a> (prezentacja i prawdziwe kodowanie na żywo), które debiutowało podczas <a href="http://warsjava.pl">WarsJava&#8217;07</a>. Przez ostatnie pół roku się dużo zmieniło i będzie to odzwierciedlone na mojej prezentacji:</p>
<ul>
<li>będzie użyta najnowsza wersja Ruby on Rails 2.0,</li>
<li>architektura REST, czyli architektura zorientowana na zasoby,</li>
<li>ilość zmian w aplikacji RoR, żeby uruchomić pod JRuby dramatycznie zmalała,</li>
<li>sposób wdrażania aplikacji RoR na serwery aplikacyjne został uproszczony,</li>
<li>i oczywiście nie zabraknie AJAXa <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</li>
</ul>
<p>Zapraszam!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mocna-kawa.com/2008/04/prezentacja-jruby-on-rails-na-bis-w-krakowie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notatki z warsztatu &#8220;JRuby on Rails&#8221;</title>
		<link>http://blog.mocna-kawa.com/2007/11/notatki-z-warsztatu-jruby-on-rails/</link>
		<comments>http://blog.mocna-kawa.com/2007/11/notatki-z-warsztatu-jruby-on-rails/#comments</comments>
		<pubDate>Sun, 18 Nov 2007 20:01:34 +0000</pubDate>
		<dc:creator>wiktor</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.mocna-kawa.com/2007/11/18/notatki-z-warsztatu-jruby-on-rails/</guid>
		<description><![CDATA[Dziękuje wszystkim, którzy pojawili się na mojej prezentacji/warsztacie podczas WarsJava. Była ona na prawdę udana, a dyskusja po prezentacji trwała ponad pół godziny! Dziękuje jeszcze raz wszytkim za obecność. Udostępniam poniżej slajdy z prezentacji (poniżej), kod aplikacji stworzonej podczas warsztatu oraz życzenie załączam moje notatki/scenariusz prezentacji.

źródła stworzonej aplikacji
scenariusz prezentacji


 &#124; View &#124; Upload your own

]]></description>
			<content:encoded><![CDATA[<p>Dziękuje wszystkim, którzy pojawili się na mojej prezentacji/warsztacie podczas WarsJava. Była ona na prawdę udana, a dyskusja po prezentacji trwała ponad pół godziny! Dziękuje jeszcze raz wszytkim za obecność. Udostępniam poniżej slajdy z prezentacji (poniżej), kod aplikacji stworzonej podczas warsztatu oraz życzenie załączam moje notatki/scenariusz prezentacji.</p>
<ul>
<li><a href="http://blog.mocna-kawa.com/wp-content/uploads/2007/11/sms.zip" title="sms.zip">źródła stworzonej aplikacji</a></li>
<li><a href="http://blog.mocna-kawa.com/wp-content/uploads/2007/11/warsztat-notatki.pdf" title="warsztat-notatki.pdf">scenariusz prezentacji</a></li>
</ul>
<div style="width:425px;text-align:left" id="__ss_171232"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=jruby-on-rails-1195415799213434-2"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=jruby-on-rails-1195415799213434-2" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/wiktor/jruby-on-rails" title="View 'JRuby On Rails ' on SlideShare">View</a> | <a href="http://www.slideshare.net/upload">Upload your own</a></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.mocna-kawa.com/2007/11/notatki-z-warsztatu-jruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Warsztaty Javowe: JRuby on Rails, czyli łączenie Javy i Rubiego</title>
		<link>http://blog.mocna-kawa.com/2007/11/warsztaty-javowe-jruby-on-rails-czyli-laczenie-javy-i-rubiego/</link>
		<comments>http://blog.mocna-kawa.com/2007/11/warsztaty-javowe-jruby-on-rails-czyli-laczenie-javy-i-rubiego/#comments</comments>
		<pubDate>Tue, 13 Nov 2007 13:53:15 +0000</pubDate>
		<dc:creator>wiktor</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.mocna-kawa.com/2007/11/13/warsztaty-javowe-jruby-on-rails-czyli-laczenie-javy-i-rubiego/</guid>
		<description><![CDATA[

Już w najbliższą sobotę o godzinie 11:00 będę dawał prezentację &#8220;JRuby on Rails, czyli łączenie Javy i Rubiego&#8221; na WarsJava &#8211; I Warszawskie Warsztaty Javowe organizowane przez Warszawa JUG. Warsztaty będą miały miejsce na MIMUWie. I co najważniejsze: WSTĘP WOLNY  .


Podczas warsztatów pokażę:

jak stworzyć prostą aplikację w Ruby on Rails,
jak korzystać z kodu Javy [...]]]></description>
			<content:encoded><![CDATA[<p class="center"><img src='http://blog.mocna-kawa.com/wp-content/uploads/2007/11/duke_ruby_rails_java.png' alt='Duke + Ruby + Rails = Java ;)' /></p>
<p>
Już w najbliższą sobotę o godzinie 11:00 będę dawał prezentację &#8220;JRuby on Rails, czyli łączenie Javy i Rubiego&#8221; na <a href="http://warsjava.pl/">WarsJava</a> &#8211; I Warszawskie Warsztaty Javowe organizowane przez <a href="http://groups.google.com/group/warszawa-jug">Warszawa JUG</a>. Warsztaty będą miały miejsce na <a href="http://www.mimuw.edu.pl">MIMUWie</a>. I co najważniejsze: <b>WSTĘP WOLNY</b> <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .
</p>
<p>
Podczas warsztatów pokażę:</p>
<ul>
<li>jak stworzyć prostą aplikację w Ruby on Rails,</li>
<li>jak korzystać z kodu Javy z poziomu Ruby&#8217;iego,</li>
<li>jak korzystać ze sterowników JDBC do łączenia się z bazą danych,</li>
<li>jak integrować stworzoną aplikacją z istniejącą aplikacją JEE (JMS, serwer aplikacji JBoss),</li>
<li>jak wdrażać aplikacje oparte o Ruby on Rails.</li>
</ul>
<p>Zapraszam!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mocna-kawa.com/2007/11/warsztaty-javowe-jruby-on-rails-czyli-laczenie-javy-i-rubiego/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sprytne testowanie modelu w Ruby on Rails</title>
		<link>http://blog.mocna-kawa.com/2007/10/sprytne-testowanie-modelu-w-ruby-on-rails/</link>
		<comments>http://blog.mocna-kawa.com/2007/10/sprytne-testowanie-modelu-w-ruby-on-rails/#comments</comments>
		<pubDate>Wed, 10 Oct 2007 18:09:11 +0000</pubDate>
		<dc:creator>wiktor</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.mocna-kawa.com/2007/10/10/sprytne-testowanie-modelu-w-ruby-on-rails/</guid>
		<description><![CDATA[Załóżmy, że mamy jakiś model w Ruby on Rails, np. User, który składa się z takich pól jak name, middlename, surname, sex oraz birthday. Oczywiście trzeba także dopisać jakaś walidację tego modelu. Wówczas nasz model będzie wyglądać następująco:
[ruby]
class User <  ActiveRecord::Base
    validates_presence_of :name, :middlename, :surname, :sex, :birthday
end
[/ruby]
Zakładam, że jestem uczciwy względem [...]]]></description>
			<content:encoded><![CDATA[<p>Załóżmy, że mamy jakiś model w <em>Ruby on Rails</em>, np. <code>User</code>, który składa się z takich pól jak <code>name</code>, <code>middlename</code>, <code>surname</code>, <code>sex</code> oraz <code>birthday</code>. Oczywiście trzeba także dopisać jakaś walidację tego modelu. Wówczas nasz model będzie wyglądać następująco:</p>
<p>[ruby]<br />
class User <  ActiveRecord::Base</p>
<p>    validates_presence_of :name, :middlename, :surname, :sex, :birthday</p>
<p>end<br />
[/ruby]</p>
<p>Zakładam, że jestem uczciwy względem siebie i chce przetestować, czy walidacje działają poprawnie. Zaczynam więc pisać test:<br />
[ruby]<br />
class UserTest < Test::Unit::TestCase<br />
  fixtures :users</p>
<p>  def test_validation_name<br />
      u = users('user1')</p>
<p>      u.name = ''<br />
      assert !u.valid?<br />
      assert u.errors.invalid?("name")</p>
<p>      u.name = nil<br />
      assert !u.valid?<br />
      assert u.errors.invalid?("name")</p>
<p>  end</p>
<p>  # ...i tak dalej... nudny w sumie kod....<br />
end<br />
[/ruby]</p>
<p>Ale przecież możemy skorzystać z dynamicznej natury Ruby'iego i wstrzyknąć wygenerowane wcześniej metody. Poniżej widać, jak to zrobić:<br />
<span id="more-39"></span><br />
[ruby]<br />
class UserTest < Test::Unit::TestCase<br />
  fixtures :users</p>
<p>  #tworzę tablicę z poniższych elementów i iteruję po niej<br />
  %w(name middlename surname sex birthday).each do  |name|</p>
<p>    #definiuję nową metodę do testowania poprawności walidacji<br />
    define_method(:&#8221;test_validation_#{name}&#8221;) do</p>
<p>        u = users(&#8216;user1&#8242;)</p>
<p>        #dynamiczne wywołanie metody, a dokładnie przypisanie pustego napisu do pola<br />
        u.send :&#8221;#{name}=&#8221;, &#8221;<br />
        assert !u.valid?<br />
        assert u.errors.invalid?(:&#8221;#{name}&#8221;)</p>
<p>        u.send :&#8221;#{name}=&#8221;, nil<br />
        assert !u.valid?<br />
        assert u.errors.invalid?(:&#8221;#{name}&#8221;)<br />
    end<br />
  end</p>
<p>end<br />
[/ruby]</p>
<p>Piękne rozwiązanie, prawda? <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mocna-kawa.com/2007/10/sprytne-testowanie-modelu-w-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>JRuby on Rails</title>
		<link>http://blog.mocna-kawa.com/2007/06/jruby-on-rails/</link>
		<comments>http://blog.mocna-kawa.com/2007/06/jruby-on-rails/#comments</comments>
		<pubDate>Wed, 06 Jun 2007 16:00:59 +0000</pubDate>
		<dc:creator>wiktor</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.mocna-kawa.com/2007/06/06/jruby-on-rails/</guid>
		<description><![CDATA[Ruby on Rails na maszynie wirtualnej Javy? Czemu nie!  
Jeśli ktoś chce prosto zacząć swoją wędrówkę z Javowego świata do dynamicznego świata Ruby i Railsów to istnieje tylko jeden sposób: Netbeans 6.0 M6 (instalacja typu full zawiera w sobie wszystko, co niezbędne; w tym JRuby i pakiet Ruby on Rails).  Można go pobrać [...]]]></description>
			<content:encoded><![CDATA[<p>Ruby on Rails na maszynie wirtualnej Javy? Czemu nie! <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Jeśli ktoś chce prosto zacząć swoją wędrówkę z Javowego świata do dynamicznego świata Ruby i Railsów to istnieje tylko jeden sposób: <b>Netbeans 6.0 M6</b> (instalacja typu full zawiera w sobie wszystko, co niezbędne; w tym JRuby i pakiet Ruby on Rails).  Można go pobrać <a href="http://dlc.sun.com/netbeans/download/6.0/milestones/latest/">stąd</a>. Teraz już albo tworzymy nowy projekt lub importujemy istniejący i wszystko działa.</p>
<p><img src='http://blog.mocna-kawa.com/wp-content/uploads/2007/06/new-ruby-project.png' alt='new-ruby-project.png' /></p>
<p><span id="more-11"></span><br />
Teraz odpalamy projekt i na konsolce możemy sprawdzić, że cała aplikacja została uruchomiona na <b>JRuby&#8217;im</b>.</p>
<p><img src='http://blog.mocna-kawa.com/wp-content/uploads/2007/06/jruby-running.png' alt='jruby-running.png' /></p>
<p>I jak się tutaj nie cieszyć <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Jeśli jesteś zainteresowany postępem w pracach nad wtyczką do Rubiego w Netbeansie to przeglądaj <a href="http://blogs.sun.com/tor/">Tor Norbye&#8217;s Weblog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mocna-kawa.com/2007/06/jruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Migracje w Ruby on Rails</title>
		<link>http://blog.mocna-kawa.com/2007/05/migracje-w-ruby-on-rails/</link>
		<comments>http://blog.mocna-kawa.com/2007/05/migracje-w-ruby-on-rails/#comments</comments>
		<pubDate>Thu, 31 May 2007 21:37:07 +0000</pubDate>
		<dc:creator>wiktor</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.mocna-kawa.com/2007/05/31/migracje-w-ruby-on-rails/</guid>
		<description><![CDATA[Ostatnio część czasu w pracy poświęcam na rozwijaniu projektu RubyTime. Jest to open-source&#8217;owa aplikacja napisana w Ruby on Rails do zliczania czasu pracy w małych firmach (ang. time tracker albo time-sheets) i następnego rozliczania pracowników i wystawiania faktur na tej podstawie klientom. Przy dodawaniu nowej funkcjonalności pierwszy raz skorzystałem z mechanizmu migracji, które oferuje Ruby [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio część czasu w pracy poświęcam na rozwijaniu projektu <a href="http://code.google.com/p/rubytime/">RubyTime</a>. Jest to open-source&#8217;owa aplikacja napisana w Ruby on Rails do zliczania czasu pracy w małych firmach (ang. time tracker albo time-sheets) i następnego rozliczania pracowników i wystawiania faktur na tej podstawie klientom. Przy dodawaniu nowej funkcjonalności pierwszy raz skorzystałem z mechanizmu migracji, które oferuje Ruby on Rails. Muszę przyznać, że jestem pod wrażeniem prostoty tego rozwiązania.<br />
<span id="more-10"></span><br />
<strong>Przede wszystkim zaskoczyło mnie inne podejście do projektowania baz danych.</strong> Oczywiście zastosowane podejście jest pochodną częstego stosowania w rozwijaniu aplikacji RoR metodyk lekkich/zwinnych (XP, Scrum). W nich z założenia przyjmuje się omylność przy projektowaniu, a krótkie iteracje służą do poprawiania/refaktoryzacji aplikacji. Dobre projektowanie baz danych nigdy nie było łatwym zajęciem, a pomyłki były częste. Nie raz zdarzało mi się, że zaprojektowana BD musiała zostać trochę zmieniona ze względu na zbędą redundancję albo efektywność albo czegoś zabrakło.</p>
<p>Ruby on Rails poprzez dostarczenie mechanizmu migracji pozwala na szybkie rozwijanie aplikacji i następnie poprawianie usterek. Trzeba podkreślić, że dodawanie nowej funkcjonalności staje się równie miłe i przyjemne.</p>
<p>Zobaczmy to na przykładzie <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Powiedzmy, że mamy już istniejącą aplikację. Naglę się zorientowaliśmy, że zapomnieliśmy wprowadzić systemu logowania dla użytkowników <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Czyli mamy model <code>User</code>, a w bazie danych ponad 1000 rekordów. Coś trzeba zrobić. Zacznijmy od wygenerowania nowej migracji:<br />
<code><br />
$ ruby script/generate migration AddLoginAndPassword<br />
   exists  db/migrate<br />
   create  db/migrate/002_add_login_and_password.rb<br />
</code></p>
<p>Teraz zabierzmy sie do edytowania pliku <code>002_add_login_and_password.rb</code>.</p>

<div class="wp_codebox"><table><tr id="p106"><td class="code" id="p10code6"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;"># Migracja zmienia model użytkownika i dodaje do niego 2 kolumny:</span>
<span style="color:#008000; font-style:italic;">#   - login (domyślna wartość to pierwsze słowo nazwy użytkownika)</span>
<span style="color:#008000; font-style:italic;">#   - password (domyślna wartość to login użytkownika)</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#9966CC; font-weight:bold;">class</span> AddLoginAndPassword <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span>
        add_column <span style="color:#ff3333; font-weight:bold;">:users</span>, <span style="color:#ff3333; font-weight:bold;">:login</span>, :<span style="color:#CC0066; font-weight:bold;">string</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span>
        add_column <span style="color:#ff3333; font-weight:bold;">:users</span>, <span style="color:#ff3333; font-weight:bold;">:password</span>, :<span style="color:#CC0066; font-weight:bold;">string</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span>
        User.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>user<span style="color:#006600; font-weight:bold;">|</span>
            user.<span style="color:#9900CC;">login</span> = user.<span style="color:#9900CC;">name</span>.<span style="color:#9900CC;">scan</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>\w<span style="color:#006600; font-weight:bold;">+/</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">strip</span>.<span style="color:#9900CC;">downcase</span>
            user.<span style="color:#9900CC;">password</span> = <span style="color:#6666ff; font-weight:bold;">Digest::SHA1</span>.<span style="color:#9900CC;">hexdigest</span><span style="color:#006600; font-weight:bold;">&#40;</span>user.<span style="color:#9900CC;">user</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            user.<span style="color:#9900CC;">save</span>
        <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span>
        remove_column <span style="color:#ff3333; font-weight:bold;">:users</span>, <span style="color:#ff3333; font-weight:bold;">:login</span>
        remove_column <span style="color:#ff3333; font-weight:bold;">:users</span>, <span style="color:#ff3333; font-weight:bold;">:password</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Powyższy kod jest bardzo czytelny i widać od razu, co on robi. Wartym podkreślenia jest fakt, że migracje pozwalają nie tylko zmieniać strukturę bazy danych, ale także wypełniać ją jakimiś danymi. Jest to bardzo przydatne, gdy wprowadzamy nową funkcjonalność. Teraz zostaje nam tylko dodać do modelu więzy spójności i odpalić:<br />
<code><br />
rake db:migrate VERSION=2<br />
</code><br />
<em>Voilà!</em> <img src='http://blog.mocna-kawa.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mocna-kawa.com/2007/05/migracje-w-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
