<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ASCIIcasts - Full Episode Feed</title>
    <description>The latest episodes from ASCIIcasts</description>
    <link>http://asciicasts.com/</link>
    <pubDate>Fri, 13 May 2011 09:07:24 +0000</pubDate>
    <ttl>1440</ttl>
    <item>
      <title>Unobtrusive JavaScript</title>
      <description>&lt;p&gt;Rails 3 &amp;ouml;zelliklerini inceledi&amp;#x11F;imiz serinin bu b&amp;ouml;l&amp;uuml;m&amp;uuml;nde unobstrusive 
Javascript&amp;#x27;in kullan&amp;#x131;m&amp;#x131;n&amp;#x131; inceleyece&amp;#x11F;iz. Unobtrusive Javascript ile web 
uygulamas&amp;#x131;nda javascript kod ile i&amp;ccedil;eri&amp;#x11F;i birbirinden CSS de oldu&amp;#x11F;u gibi 
ayr&amp;#x131;l&amp;#x131;r. Unobtrusive Javascript&amp;#x27;i Rails&amp;#x27;de kullanmaya ba&amp;#x15F;lamadan &amp;ouml;nce basit 
bir HTML d&amp;ouml;k&amp;uuml;man i&amp;ccedil;inde kullanal&amp;#x131;m.&lt;/p&gt;

&lt;p&gt;A&amp;#x15F;a&amp;#x11F;&amp;#x131;daki ekran g&amp;ouml;r&amp;uuml;nt&amp;uuml;s&amp;uuml; &amp;uuml;zerinde bir link olan bir web sayfas&amp;#x131;n&amp;#x131; 
g&amp;ouml;steriyor. Link t&amp;#x131;kland&amp;#x131;&amp;#x11F;&amp;#x131;nda Javascript alarm popup a&amp;ccedil;&amp;#x131;l&amp;#x131;r ve &amp;quot;Hello world!&amp;quot; 
mesaj&amp;#x131; verir.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/343/original/E205I01.png" alt="The alert shown by the inline JavaScript." height="337" width="639"&gt;
&lt;/div&gt;

&lt;p&gt;Bu sayfan&amp;#x131;n HTML kodu &amp;#x15F;una benzer:&lt;/p&gt;
&lt;pre class="ruby"&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
      &amp;lt;title&amp;gt;UJS Example&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
      &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onclick=&amp;quot;alert(&amp;#x27;Hello world!&amp;#x27;); return false;&amp;quot;&amp;gt;Click Here&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Sayfada bir linkimiz var ve onclick &amp;ouml;zelli&amp;#x11F;ine de bir Javascript kod
yaz&amp;#x131;lm&amp;#x131;&amp;#x15F;. Script HTML i&amp;ccedil;inde birle&amp;#x15F;ik oldu&amp;#x11F;undan unobtrusive de&amp;#x11F;ildir
ve iyi bir &amp;#x15F;ey de&amp;#x11F;ildir, &amp;ccedil;&amp;uuml;nk&amp;uuml; i&amp;ccedil;erik ve kod birbirine kar&amp;#x131;&amp;#x15F;&amp;#x131;yor.
1990&amp;#x27;lar&amp;#x131;n sayfalar&amp;#x131;nda CSS olmad&amp;#x131;&amp;#x11F;&amp;#x131; i&amp;ccedil;in &amp;lt;font&amp;gt; tag&amp;#x27;i ile yaz&amp;#x131;
g&amp;ouml;r&amp;uuml;n&amp;uuml;m&amp;uuml; de&amp;#x11F;i&amp;#x15F;tirilirdi, sayfada y&amp;uuml;zlerce bunlardan olurdu. Taray&amp;#x131;c&amp;#x131;lar
CSS kullanmaya ba&amp;#x15F;lay&amp;#x131;nca stil bilgileri stylesheet dosyalar&amp;#x131;nda
toplanmaya ba&amp;#x15F;lad&amp;#x131; ve hem de&amp;#x11F;i&amp;#x15F;iklik yap&amp;#x131;lmas&amp;#x131; kolayla&amp;#x15F;t&amp;#x131; hem daha
anla&amp;#x15F;&amp;#x131;l&amp;#x131;r oldu.&lt;/p&gt;

&lt;p&gt;Ayn&amp;#x131;s&amp;#x131; Javascript&amp;#x27;e de uygulanabilir. K&amp;uuml;&amp;ccedil;&amp;uuml;k k&amp;uuml;&amp;ccedil;&amp;uuml;k Javascript kod
par&amp;ccedil;alar&amp;#x131; HTML taglar&amp;#x131;n &amp;ouml;zellikleri i&amp;ccedil;inde yaz&amp;#x131;l&amp;#x131;rsa de&amp;#x11F;i&amp;#x15F;iklik yapmak
zorla&amp;#x15F;&amp;#x131;r. Javascript&amp;#x27;i ayr&amp;#x131; bir dosyaya koyunca tekrarlayan kodlar
azal&amp;#x131;r, d&amp;uuml;zenlemeler kolayla&amp;#x15F;&amp;#x131;r ve karma&amp;#x15F;&amp;#x131;k uygulamalar&amp;#x131; &amp;uuml;retmek ve
debug kolayla&amp;#x15F;&amp;#x131;r.&lt;/p&gt;

&lt;p&gt;&amp;Ouml;rne&amp;#x11F;imizi nas&amp;#x131;l unobtrusive yapaca&amp;#x11F;&amp;#x131;z? Ana ad&amp;#x131;m, onclick
&amp;ouml;zelli&amp;#x11F;indeki Javascript&amp;#x27;i ayr&amp;#x131; bir dosyaya ta&amp;#x15F;&amp;#x131;mak ve bunun i&amp;ccedil;in bir
Javascript framework kullanaca&amp;#x11F;&amp;#x131;z. Burada JQuery ile elemanlar&amp;#x131;n
olaylar&amp;#x131;n&amp;#x131; alg&amp;#x131;layaca&amp;#x11F;&amp;#x131;z. &amp;Ouml;nce sayfan&amp;#x131;n de&amp;#x11F;i&amp;#x15F;mi&amp;#x15F;ini
bir g&amp;ouml;relim sonra a&amp;ccedil;&amp;#x131;klayal&amp;#x131;m.&lt;/p&gt;

&lt;pre class="ruby"&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;UJS Example&amp;lt;/title&amp;gt;
    &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&amp;quot; type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
      $(function () {
        $(&amp;#x27;#alert&amp;#x27;).click(function () {
          alert(&amp;#x27;Hello, world!&amp;#x27;);
          return false;
        })
      });
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; id=&amp;quot;alert&amp;quot;&amp;gt;Click Here&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x130;lk Dikkat &amp;ccedil;eken nokta Javascript&amp;#x27;i daha &amp;ouml;nce s&amp;ouml;yledi&amp;#x11F;imiz gibi ayr&amp;#x131;
bir dosyaya &amp;ccedil;&amp;#x131;karmad&amp;#x131;k. Bunu sadece burda g&amp;ouml;sterim i&amp;ccedil;in yapt&amp;#x131;k.&lt;/p&gt; 

&lt;p&gt;Body i&amp;ccedil;indeki eleman&amp;#x131;n &lt;code&gt;onclick&lt;/code&gt; &amp;ouml;zelli&amp;#x11F;ini kald&amp;#x131;r&amp;#x131;p ona bir &lt;code&gt;id&lt;/code&gt;
verdik. Bu sayede hedefe JQuery &amp;uuml;zerinden bir ba&amp;#x11F;lant&amp;#x131; yapabiliriz.
Daha sonra head b&amp;ouml;l&amp;uuml;m&amp;uuml;nde JQuery k&amp;uuml;t&amp;uuml;phanesini y&amp;uuml;kl&amp;uuml;yoruz ve bunun
alt&amp;#x131;nda d&amp;#x131;&amp;#x15F; dosyaya koyaca&amp;#x11F;&amp;#x131;m&amp;#x131;z script g&amp;ouml;r&amp;uuml;n&amp;uuml;yor. Script JQuery&amp;#x27;nin &lt;span style="font-weight: bold;"&gt;$&lt;/span&gt;
fonksiyonunu bir fonksiyon arg&amp;uuml;man&amp;#x131; ile &amp;ccedil;a&amp;#x11F;&amp;#x131;r&amp;#x131;yor. Arg&amp;uuml;mandaki bu
fonksiyon sayfa DOM y&amp;uuml;klemesinde &amp;ccedil;a&amp;#x11F;r&amp;#x131;l&amp;#x131;r. Bu fonksiyon JQuery ile
eleman&amp;#x131; id&amp;#x27;sinden bulur ve click olay&amp;#x131;na bir fonksiyon ba&amp;#x11F;lar. Ba&amp;#x11F;lanan
fonksiyon ise bir alert ile mesaj verir ve geriye false d&amp;ouml;nerek link
ba&amp;#x11F;lant&amp;#x131;s&amp;#x131;na gidilmesini engeller.&lt;/p&gt;

&lt;p&gt;E&amp;#x11F;er sayfay&amp;#x131; &amp;#x15F;imdi tazelersek aynen bir &amp;ouml;ncekinin yapt&amp;#x131;&amp;#x11F;&amp;#x131;n&amp;#x131;
yapacakt&amp;#x131;r. T&amp;#x131;klan&amp;#x131;nca bir alarm verecektir.&lt;/p&gt; 

&lt;p&gt;Burda &amp;ccedil;ok i&amp;#x15F; yapmam&amp;#x131;za ra&amp;#x11F;men kar&amp;#x15F;&amp;#x131;l&amp;#x131;&amp;#x11F;&amp;#x131;nda
pek bir &amp;#x15F;ey elde etmedik. Burada Unobtrusive Javascript avantajlar&amp;#x131;n&amp;#x131;
pek g&amp;ouml;remedik tek sat&amp;#x131;r Javascript yerine 6 sat&amp;#x131;r oldu. Bu &amp;ouml;rnek sadece
Unobtrusive Javascript&amp;#x27;in mant&amp;#x131;&amp;#x11F;&amp;#x131;n&amp;#x131; anlatmak i&amp;ccedil;in yap&amp;#x131;ld&amp;#x131;. Unobtrusive
Javascript&amp;#x27;in avantaj&amp;#x131; sayfadaki Javascript say&amp;#x131;s&amp;#x131; artt&amp;#x131;k&amp;ccedil;a ortaya
&amp;ccedil;&amp;#x131;kmaya ba&amp;#x15F;lar. T&amp;uuml;m Javascript kodlar&amp;#x131;n&amp;#x131; ayr&amp;#x131; bir dosyada tutmak
sayesinde tekrarlamalar&amp;#x131;n &amp;ouml;n&amp;uuml;ne ge&amp;ccedil;ilmeye ba&amp;#x15F;lan&amp;#x131;r.&lt;/p&gt;

&lt;p&gt;Bu yakla&amp;#x15F;&amp;#x131;m&amp;#x131;n bir sorunu var. JavaScript genellikle statik bir
dosyaya yaz&amp;#x131;l&amp;#x131;yor. Bu durumda sat&amp;#x131;r i&amp;ccedil;ine yazmad&amp;#x131;&amp;#x11F;&amp;#x131;m&amp;#x131;za g&amp;ouml;re nas&amp;#x131;l
server taraf&amp;#x131; dinamik JavaScript ekleyebilece&amp;#x11F;iz?&lt;/p&gt; 

&lt;p&gt;HTML 5 ile birlikte art&amp;#x131;k &amp;#x131;smarlama verileri ilgili eleman tag i&amp;ccedil;ine
&amp;ouml;zellik olarak koyabiliyoruz. Bunlar ayn&amp;#x131; di&amp;#x11F;er &amp;ouml;zellikler gibi
yaz&amp;#x131;l&amp;#x131;yor, tek farklar&amp;#x131; &lt;code&gt;data-&lt;/code&gt; ile ba&amp;#x15F;lamalar&amp;#x131;. Mesela
t&amp;#x131;klan&amp;#x131;nca verilecek mesaj&amp;#x131; &amp;ouml;zellikte saklamak i&amp;ccedil;in &amp;#x15F;&amp;ouml;yle yaz&amp;#x131;n:&lt;/p&gt;

&lt;pre class="ruby"&gt;&amp;lt;a href=&amp;quot;#&amp;quot; id=&amp;quot;alert&amp;quot; data-message=&amp;quot;Hello from UJS&amp;quot;&amp;gt;Click Here&amp;lt;/a&amp;gt;&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;JavaScript&amp;#x27;de alert sat&amp;#x131;r&amp;#x131;n&amp;#x131; mesaj&amp;#x131; bu yeni &amp;ouml;zellikten alacak
&amp;#x15F;ekilde de&amp;#x11F;i&amp;#x15F;tirelim:&lt;/p&gt;
&lt;pre class="javascript"&gt;$(function () {
  $(&amp;#x27;#alert&amp;#x27;).click(function () {
    alert(this.getAttribute(&amp;#x27;data-message&amp;#x27;));
    return false;
   })
});
&lt;/pre&gt;
&lt;p&gt;E&amp;#x11F;er sayfay&amp;#x131; tazelersek linki t&amp;#x131;klay&amp;#x131;nca &amp;ouml;zeliikten gelen mesaj&amp;#x131;
alabiliriz.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/344/original/E205I02.png" alt="The alert created by unobtrusive JavaScript." height="440" width="747"&gt;
&lt;/div&gt;

&lt;h3&gt;Rails 3 Data &amp;Ouml;zelliklerini Nas&amp;#x131;l Kullan&amp;#x131;r&lt;/h3&gt;

&lt;p&gt;Rails 3 bu &amp;#x131;smarlama data &amp;ouml;zellikler ile veriyi JavaScript&amp;#x27;e
g&amp;ouml;nderir. &amp;#x15E;imdi bunun bir Rails 3 uygulamas&amp;#x131;nda nas&amp;#x131;l olaca&amp;#x11F;&amp;#x131;n&amp;#x131;
inceleyelim. Uygulamam&amp;#x131;z i&amp;ccedil;inde arama yap&amp;#x131;labilecek &amp;uuml;r&amp;uuml;nlerin listesi
bulunan basit bir e-al&amp;#x131;&amp;#x15F;veri&amp;#x15F; uygulamas&amp;#x131;. Ayr&amp;#x131;ca &amp;uuml;r&amp;uuml;n&amp;uuml; d&amp;uuml;zenlemek ve
silmek i&amp;ccedil;in de linkler var , ama silmek i&amp;ccedil;in olan &amp;ccedil;al&amp;#x131;&amp;#x15F;m&amp;#x131;yor gibi.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/345/original/E205I03.png" alt="The product page with the non-working destroy link." height="357" width="800"&gt;
&lt;/div&gt;

&lt;p&gt;Bu Rails 3 uygulamalar&amp;#x131;nda s&amp;#x131;k kar&amp;#x15F;&amp;#x131;la&amp;#x15F;&amp;#x131;lan bir sorundur. E&amp;#x11F;er eski
bir versiyon uygulamay&amp;#x131; upgrade ediyorsan&amp;#x131;z, JavaScript&amp;#x27;lerin
&amp;ccedil;al&amp;#x131;&amp;#x15F;mamas&amp;#x131; &amp;ccedil;ok kar&amp;#x15F;&amp;#x131;la&amp;#x15F;&amp;#x131;lan bir durumdur.&lt;/p&gt;

&lt;p&gt;G&amp;ouml;rsel dosyas&amp;#x131;ndaki kod &amp;quot;Destroy&amp;quot; linkini standart link_to metodunu
kullanarak &amp;uuml;retir. :confirm opsiyonu ile bir JavaScript &lt;code&gt;confirm&lt;/code&gt; 
alarm&amp;#x131; &amp;uuml;retilir ve &lt;code&gt;:method&lt;/code&gt; opsiyonu da &lt;code&gt;:delete&lt;/code&gt; 
olarak ayarlanm&amp;#x131;&amp;#x15F;t&amp;#x131;r. B&amp;ouml;ylece link t&amp;#x131;klan&amp;#x131;nca GET yerine DELETE
metoduna &amp;ccedil;a&amp;#x11F;r&amp;#x131; yap&amp;#x131;lacakt&amp;#x131;r.&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/show.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;&amp;lt;%= link_to &amp;quot;Destroy&amp;quot;, @product, :confirm =&amp;gt; &amp;quot;Are you sure?&amp;quot;, :method =&amp;gt; :delete %&amp;gt;&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;Burada enteresan olan bu kodun &amp;uuml;retti&amp;#x11F;i HTML kod:&lt;/p&gt;
&lt;pre class="ruby"&gt;&amp;lt;a href=&amp;quot;/products/8&amp;quot; data-confirm=&amp;quot;Are you sure?&amp;quot; data-method=&amp;quot;delete&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;Destroy&amp;lt;/a&amp;gt;&lt;br&gt;&lt;/pre&gt;

&lt;p&gt;Rails 2&amp;#x27;de destroy link olu&amp;#x15F;turmak i&amp;ccedil;in &lt;code&gt;link_to&lt;/code&gt; kullan&amp;#x131;nca 
bir s&amp;uuml;r&amp;uuml; JavaScript ile &lt;code&gt;confirm&lt;/code&gt; diyalo&amp;#x11F;u olu&amp;#x15F;turuluyor ve bir form ile DELETE ya da PUT &amp;ccedil;a&amp;#x11F;r&amp;#x131;s&amp;#x131;
yap&amp;#x131;l&amp;#x131;yordu. Rails 3 koduna bakarsan&amp;#x131;z daha temiz ve daha &amp;ouml;nce
g&amp;ouml;rd&amp;uuml;&amp;#x11F;&amp;uuml;m&amp;uuml;z HTML 5 data &amp;ouml;zelliklerini kullan&amp;#x131;yor. Onay mesaj&amp;#x131;n&amp;#x131; i&amp;ccedil;eren
bir &lt;code&gt;data-confirm&lt;/code&gt;  ve metodu saklayan bir data-method
&amp;ouml;zelli&amp;#x11F;i.&lt;/p&gt;

&lt;p&gt;Linkin &amp;ccedil;al&amp;#x131;&amp;#x15F;mama sebebi head b&amp;ouml;l&amp;uuml;m&amp;uuml;nde JavaScript fonksiyon
tan&amp;#x131;mlanmad&amp;#x131;&amp;#x11F;&amp;#x131; i&amp;ccedil;in , standart bir GET &amp;ccedil;a&amp;#x11F;r&amp;#x131;s&amp;#x131; yap&amp;#x131;lacak ve silme
i&amp;#x15F;lemi DELETE &amp;ccedil;a&amp;#x11F;r&amp;#x131;lmad&amp;#x131;&amp;#x11F;&amp;#x131; i&amp;ccedil;in ger&amp;ccedil;ekle&amp;#x15F;meyecektir.&lt;/p&gt;

&lt;p&gt;Bunu d&amp;uuml;zeltmek i&amp;ccedil;in uygulaman&amp;#x131;n layout dosyas&amp;#x131;na a&amp;#x15F;a&amp;#x11F;&amp;#x131;daki iki
sat&amp;#x131;r&amp;#x131; eklemeliyiz:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/layouts/application.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;&amp;lt;%= javascript_include_tag :defaults %&amp;gt;&lt;br&gt;
&amp;lt;%= csrf_meta_tag %&amp;gt;&lt;br&gt;
&lt;/pre&gt;

&lt;p&gt;Yukardaki ilk sat&amp;#x131;r tan&amp;#x131;d&amp;#x131;k gelecektir. Bir Rails uygulamas&amp;#x131; i&amp;ccedil;in
standart JavaScript dosyalar&amp;#x131; y&amp;uuml;kl&amp;uuml;yor. &amp;#x130;kinci sat&amp;#x131;r DELETE i&amp;#x15F;lemlerini
ger&amp;ccedil;ekle&amp;#x15F;tirmek i&amp;ccedil;in gerekli yetkilendirme bilgilerini ta&amp;#x15F;&amp;#x131;yan iki
metatag &amp;uuml;retir. De&amp;#x11F;i&amp;#x15F;im sonras&amp;#x131; sayfay&amp;#x131; tazelersek &amp;uuml;retilen iki sat&amp;#x131;r&amp;#x131;
g&amp;ouml;rece&amp;#x11F;iz.&lt;/p&gt;

&lt;pre class="ruby"&gt;&amp;lt;script src=&amp;quot;/javascripts/prototype.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/javascripts/effects.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/javascripts/dragdrop.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/javascripts/controls.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/javascripts/rails.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/javascripts/application.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;meta name=&amp;quot;csrf-param&amp;quot; content=&amp;quot;authenticity_token&amp;quot;/&amp;gt;
&amp;lt;meta name=&amp;quot;csrf-token&amp;quot; content=&amp;quot;9ImdFvbeW7ih9oKqBDQ3O889q/hJ1q5uajpT4DFDAoA=&amp;quot;/&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x15E;imdi sayfada t&amp;uuml;m JavaScript dosyalara eri&amp;#x15F;im ve cross-site
sald&amp;#x131;r&amp;#x131;lara kar&amp;#x15F;&amp;#x131; t&amp;uuml;m &amp;ouml;nlemler mevcuttur. B&amp;ouml;ylece PUT ve DELETE
&amp;ccedil;a&amp;#x11F;r&amp;#x131;lar&amp;#x131;n&amp;#x131;n bir hacker taraf&amp;#x131;ndan de&amp;#x11F;il do&amp;#x11F;ru ki&amp;#x15F;iden geldi&amp;#x11F;inden emin
olabiliriz.&lt;/p&gt; 

&lt;p&gt;Bu iki sat&amp;#x131;rla beraber bizim destroy linkimiz beklendi&amp;#x11F;i gibi
&amp;ccedil;al&amp;#x131;&amp;#x15F;acakt&amp;#x131;r.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/346/original/E205I04.png" alt="The destroy link now works." height="360" width="802"&gt;
&lt;/div&gt;

&lt;h3&gt;Bir Arama Formuna AJAX Eklemek&lt;/h3&gt;

&lt;p&gt;Sonra index sayfas&amp;#x131;ndaki arama formunu de&amp;#x11F;i&amp;#x15F;tirerek GET &amp;ccedil;a&amp;#x11F;r&amp;#x131;s&amp;#x131;
yerine AJAX kullanmas&amp;#x131;n&amp;#x131; sa&amp;#x11F;l&amp;#x131;yaca&amp;#x11F;&amp;#x131;z. &lt;code&gt;Index&lt;/code&gt; g&amp;ouml;rselindeki form i&amp;ccedil;in kod
a&amp;#x15F;a&amp;#x11F;&amp;#x131;da g&amp;ouml;steriliyor:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/index.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;&amp;lt;% title &amp;quot;Products&amp;quot; %&amp;gt;

&amp;lt;% form_tag products_path, :method =&amp;gt; :get do %&amp;gt;
  &amp;lt;p&amp;gt;    
  &amp;lt;%= text_field_tag :search, params[:search] %&amp;gt;
  &amp;lt;%= submit_tag &amp;quot;Search&amp;quot;, :name =&amp;gt; nil %&amp;gt;
  &amp;lt;/p&amp;gt;
&amp;lt;% end %&amp;gt;

&amp;lt;div id=&amp;quot;products&amp;quot;&amp;gt;
  &amp;lt;%= render @products %&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;%= link_to &amp;quot;New Product&amp;quot;, new_product_path %&amp;gt;&amp;lt;/p&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Burada kullan&amp;#x131;lan form &lt;a href="http://railscasts.com/episodes/37-simple-search-form"&gt;episode 37&lt;/a&gt;. 
 de g&amp;ouml;sterilen teknikle arama yapmak i&amp;ccedil;indir. Rails&amp;#x27;in &amp;ouml;nceki
versiyonlar&amp;#x131;nda formun AJAX ile &amp;ccedil;al&amp;#x131;&amp;#x15F;mas&amp;#x131; i&amp;ccedil;in&amp;nbsp;&lt;code&gt;form_tag&lt;/code&gt; ile 
&lt;code&gt;form_remote_tag&lt;/code&gt; de&amp;#x11F;i&amp;#x15F;tirilirdi. Bu metod &amp;#x15F;imdi
sak&amp;#x131;nmaya &amp;ccedil;al&amp;#x131;&amp;#x15F;t&amp;#x131;&amp;#x11F;&amp;#x131;m&amp;#x131;z sat&amp;#x131;r i&amp;ccedil;i JavaScript&amp;#x27;ten bir s&amp;uuml;r&amp;uuml; &amp;uuml;retecektir.&lt;/p&gt;

&lt;p&gt;Rails 3 ile beraber bir&amp;ccedil;ok remote helper metod art&amp;#x131;k kullan&amp;#x131;lamaz
oldu. E&amp;#x11F;er kullanmak istersek 
&lt;a href="http://github.com/rails/prototype_legacy_helper"&gt;Prototype Legacy Helper&lt;/a&gt; 
 plugin install etmeliyiz.&lt;/p&gt;

&lt;p&gt;Bunu &lt;code&gt;form_remote_tag&lt;/code&gt; ile yapmak yerine yine &lt;code&gt;form_tag&lt;/code&gt;, 
kullan&amp;#x131;yoruz ama yeni bir parametre ile  &lt;code&gt;:remote&lt;/code&gt;.&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/index.html.erb&lt;/p&gt;

&lt;pre class="ruby"&gt;&amp;lt;% form_tag products_path, :method =&amp;gt; :get, :remote =&amp;gt; true do %&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;%= text_field_tag :search, params[:search] %&amp;gt;
    &amp;lt;%= submit_tag &amp;quot;Search&amp;quot;, :name =&amp;gt; nil %&amp;gt;
  &amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;% end %&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Bu &lt;code&gt;:remote&lt;/code&gt; parametresi ayr&amp;#x131;ca &lt;code&gt;link_to&lt;/code&gt;, 
&lt;code&gt;button_to&lt;/code&gt; ve &lt;code&gt;form_for&lt;/code&gt; gibi di&amp;#x11F;er helper metodlarla 
da kullan&amp;#x131;labilir. E&amp;#x11F;er sayfay&amp;#x131; tazeleyip kayna&amp;#x11F;&amp;#x131; incelersek yeni form kodumuzun 
nas&amp;#x131;l &amp;ccedil;al&amp;#x131;&amp;#x15F;t&amp;#x131;&amp;#x11F;&amp;#x131;n&amp;#x131; g&amp;ouml;r&amp;uuml;r&amp;uuml;z.&lt;/p&gt;

&lt;pre class="ruby"&gt;&amp;lt;form action=&amp;quot;/products&amp;quot; data-remote=&amp;quot;true&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;  &amp;lt;p&amp;gt;
    &amp;lt;input id=&amp;quot;search&amp;quot; name=&amp;quot;search&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot; /&amp;gt;
  &amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;/form&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Form eleman&amp;#x131; ayn&amp;#x131; ama bu sefer yeni bir &lt;code&gt;data-remote&lt;/code&gt;
&amp;ouml;zelli&amp;#x11F;i var. Sat&amp;#x131;r i&amp;ccedil;i JavaScript yok, yeni &amp;ouml;zellik&amp;nbsp; &lt;code&gt;rails.js&lt;/code&gt;
i&amp;ccedil;indeki JavaScript&amp;#x27;e formun AJAX yoluyla g&amp;ouml;nderildi&amp;#x11F;ini anlatmaya
yeter.&lt;/p&gt;

&lt;p&gt;S&amp;#x131;rada AJAX &amp;ccedil;a&amp;#x11F;r&amp;#x131;s&amp;#x131;n&amp;#x131; i&amp;#x15F;leyecek kodu yazmak var. &amp;Uuml;r&amp;uuml;nlerin listesi
bir&amp;nbsp; &lt;code&gt;div&lt;/code&gt; i&amp;ccedil;ersinde bulunuyor. Bu&amp;nbsp; &lt;code&gt;div&lt;/code&gt;&amp;nbsp;
i&amp;ccedil;eri&amp;#x11F;ini update ederek sadece aranan &amp;uuml;r&amp;uuml;nleri g&amp;ouml;sterebiliriz.
Form&amp;nbsp; &lt;code&gt;ProductController&lt;/code&gt;&amp;rsquo;in
&lt;code&gt;index&lt;/code&gt; eylemine g&amp;ouml;nderiliyor ve t&amp;uuml;m ihtiyac&amp;#x131;m&amp;#x131;z olan
JavaScript isteklerini i&amp;#x15F;leyecek bir&amp;nbsp; &lt;code&gt;index.js.erb&lt;/code&gt;
dosyas&amp;#x131; eklemek&lt;code&gt;.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu kal&amp;#x131;p dosyaya taray&amp;#x131;c&amp;#x131;ya d&amp;ouml;n&amp;uuml;ld&amp;uuml;&amp;#x11F;&amp;uuml;nde &amp;ccedil;al&amp;#x131;&amp;#x15F;mas&amp;#x131;n&amp;#x131; bekledi&amp;#x11F;imiz
herhangi bir JavaScript kodu yazabiliriz. Yeni kal&amp;#x131;p dosyam&amp;#x131;zdaki kod
div i&amp;ccedil;eri&amp;#x11F;ini sonuca g&amp;ouml;re update edecek.&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/index.js.erb&lt;/p&gt;
&lt;pre class="javascript"&gt;$(&amp;quot;products&amp;quot;).update(&amp;quot;&amp;lt;%= escape_javascript(render(@products))%&amp;gt;&amp;quot;);&lt;br&gt;
&lt;/pre&gt;

&lt;p&gt;Sayfay&amp;#x131; tazeledi&amp;#x11F;imizde ve formun g&amp;ouml;nderme d&amp;uuml;&amp;#x11F;mesine t&amp;#x131;klad&amp;#x131;&amp;#x11F;&amp;#x131;m&amp;#x131;zda
arama AJAX &amp;ccedil;a&amp;#x11F;r&amp;#x131;s&amp;#x131; ile yap&amp;#x131;lacak ve URL de&amp;#x11F;i&amp;#x15F;meyecektir.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/347/original/E205I05.png" alt="The search form working with AJAX." height="409" width="801"&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x130;&amp;#x15F;te b&amp;ouml;yle, Rails 3 ile unobtrusive JavaScript sadece :remote
parametresi kullanarak yap&amp;#x131;l&amp;#x131;yor. AJAX &amp;ccedil;a&amp;#x11F;r&amp;#x131;s&amp;#x131;na bir server bir
JavaScript ile d&amp;ouml;n&amp;uuml;&amp;#x15F; yap&amp;#x131;yor ve o da div i&amp;ccedil;eri&amp;#x11F;ini de&amp;#x11F;i&amp;#x15F;tiriyor.&lt;/p&gt;

&lt;h3&gt;Frameworklar&amp;#x131; De&amp;#x11F;i&amp;#x15F;tirmek&lt;/h3&gt;

&lt;p&gt;Bu b&amp;ouml;l&amp;uuml;m&amp;uuml; uygulamam&amp;#x131;z&amp;#x131;n kulland&amp;#x131;&amp;#x11F;&amp;#x131; JavaScript Framework&amp;#x27;u nas&amp;#x131;l
de&amp;#x11F;i&amp;#x15F;tirce&amp;#x11F;imizi g&amp;ouml;stererek kapataca&amp;#x11F;&amp;#x131;z. Uygulamam&amp;#x131;z &amp;#x15F;u anda Prototype
kullan&amp;#x131;yor, bu Rails&amp;#x27;in par&amp;ccedil;as&amp;#x131; olarak geliyor , fakat JQuery kullanmak
istiyorsak ne olacak?&lt;/p&gt;

&lt;p&gt;&amp;#x130;lk&amp;ouml;nce uygulama layout&amp;#x27;da yer alan &amp;#x15F;u sat&amp;#x131;r&amp;#x131; de&amp;#x11F;i&amp;#x15F;tirmeliyiz.&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/layouts/application.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;&amp;lt;%= javascript_include_tag :defaults %&amp;gt;&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;&amp;#x15F;&amp;ouml;yle de&amp;#x11F;i&amp;#x15F;tirin:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/layouts/application.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;&amp;lt;%= javascript_include_tag &amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&amp;quot;, &amp;quot;jquery.rails.js&amp;quot; %&amp;gt;&lt;br&gt;&lt;/pre&gt;

&lt;p&gt;Listedeki ilk dosya Google &amp;uuml;zerinden JQuery&amp;#x27;nin son versiyonu. Bu tek 
ba&amp;#x15F;&amp;#x131;na yeterli de&amp;#x11F;il &lt;code&gt;rails.js&lt;/code&gt;  dosyas&amp;#x131;n&amp;#x131;n JQuery e&amp;#x15F;leni&amp;#x11F;ini 
de y&amp;uuml;klememiz gerekiyor, yoksa unobtrusive uygulamalar&amp;#x131;m&amp;#x131;z &amp;ccedil;al&amp;#x131;&amp;#x15F;maz. Bu 
dosyan&amp;#x131;n orjinalini&amp;nbsp; &lt;a href="http://github.com/rails/jquery-ujs"&gt;jquery-ujs project on Github&lt;/a&gt;
adresinde bulabilirsiniz. Bu projede indirip projemizde kullanabilece&amp;#x11F;imiz 
bir &lt;code&gt;rails.js&lt;/code&gt; dosyas&amp;#x131; vard&amp;#x131;r. Bu dosyay&amp;#x131; indirip uygulamam&amp;#x131;z&amp;#x131;n&amp;nbsp; 
&lt;code&gt;/public/javascripts&lt;/code&gt; klas&amp;ouml;r&amp;uuml;ne koyal&amp;#x131;m ve ad&amp;#x131;n&amp;#x131; &lt;code&gt;jquery.rails.js&lt;/code&gt; 
yapal&amp;#x131;m ve bu dosya uygulamam&amp;#x131;z&amp;#x131;n Rails taraf&amp;#x131;ndan kullan&amp;#x131;lan unobtrusive 
JavaScript i&amp;#x15F;lerini ger&amp;ccedil;ekle&amp;#x15F;tirir.&lt;/p&gt;

&lt;p&gt;&amp;#x15E;imdi daha &amp;ouml;nce uygulamam&amp;#x131;za bizim ekledi&amp;#x11F;imiz Prototype&amp;#x27;a g&amp;ouml;re olan
JavaScript&amp;#x27;imizi JQuery&amp;#x27;ye uygun olacak &amp;#x15F;ekilde de&amp;#x11F;itirmek zorunday&amp;#x131;z.
Daha &amp;ouml;nce &amp;uuml;retti&amp;#x11F;imiz &lt;code&gt;index.js.erb&lt;/code&gt;
dosyas&amp;#x131;nda k&amp;uuml;&amp;ccedil;&amp;uuml;k bir de&amp;#x11F;i&amp;#x15F;iklik yapaca&amp;#x11F;&amp;#x131;z. Div se&amp;ccedil;icisi olarak &lt;code&gt;products&lt;/code&gt;
yerine &lt;code&gt;#products&lt;/code&gt; kullanarak ve Prototype&amp;#x27;&amp;#x131;n &lt;code&gt;update&lt;/code&gt; 
metodu yerine JQuery e&amp;#x15F;leni&amp;#x11F;i olan &lt;code&gt;html&lt;/code&gt; kullanarak.&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/index.js.erb&lt;/p&gt;
&lt;pre class="javascript"&gt;$(&amp;quot;#products&amp;quot;).html(&amp;quot;&amp;lt;%= escape_javascript(render(@products))%&amp;gt;&amp;quot;);&lt;br&gt;
&lt;/pre&gt;

&lt;p&gt;Uygulamam&amp;#x131;z art&amp;#x131;k kaputun alt&amp;#x131;nda Prototype yerine JQuery kullan&amp;#x131;yor.&lt;/p&gt;

&lt;h3&gt;Esteti&amp;#x11F;in Kaybolmas&amp;#x131;&lt;/h3&gt;

&lt;p&gt;E&amp;#x11F;er bir kullan&amp;#x131;c&amp;#x131; JavaScript izin verilmeyen bir taray&amp;#x131;c&amp;#x131;
kullanarak uygulamam&amp;#x131;z&amp;#x131; a&amp;ccedil;arsa biraz estetik kayb&amp;#x131; olacakt&amp;#x131;r. Buton
normal bir GET &amp;ccedil;a&amp;#x11F;r&amp;#x131;s&amp;#x131; yapacakt&amp;#x131;r. &amp;Uuml;r&amp;uuml;n silme linki de &amp;ccedil;al&amp;#x131;&amp;#x15F;mayacakt&amp;#x131;r.
Bu genel bir problemdir, HTML linkleri sadece GET &amp;ccedil;a&amp;#x11F;r&amp;#x131;lar&amp;#x131; yapabilir,
bu y&amp;uuml;zden Rails DELETE i&amp;ccedil;in biraz JavaScript kullan&amp;#x131;r. Bunun &amp;ouml;n&amp;uuml;ne
ge&amp;ccedil;mek i&amp;ccedil;in bir y&amp;ouml;ntem &lt;code&gt;button_to&lt;/code&gt;
kullanmakt&amp;#x131;r ama &amp;ccedil;irkin g&amp;ouml;r&amp;uuml;necektir, bu y&amp;uuml;zden link olarak kalmal&amp;#x131;. Tercih 
edilebilecek bir teknik olarak  &lt;a href="http://railscasts.com/episodes/77-destroy-without-javascript"&gt;episode
77&lt;/a&gt; &amp;nbsp; de JavaScript izin verilmeyen taray&amp;#x131;c&amp;#x131;larda silme i&amp;#x15F;lemi i&amp;ccedil;in 
ba&amp;#x15F;ka sayfa a&amp;ccedil;an &amp;ouml;rnek var.&lt;/p&gt;
</description>
      <pubDate>Thu, 12 May 2011 22:14:57 +0000</pubDate>
      <guid>http://tr.asciicasts.com/episodes/205-unobtrusive-javascript</guid>
      <link>http://tr.asciicasts.com/episodes/205-unobtrusive-javascript</link>
    </item>
    <item>
      <title>Formtastic B&#246;l&#252;m 2</title>
      <description>    &lt;p&gt;&amp;#214;nceki b&amp;#246;l&amp;#252;mde, &amp;#231;ok az kodla form view&amp;rsquo;lar&amp;#305; olu&amp;#351;turmak i&amp;#231;in harika bir gem olan &lt;a href="http://github.com/justinfrench/formtastic"&gt;Formtastic&lt;/a&gt; gem&amp;rsquo;ini tan&amp;#305;tm&amp;#305;&amp;#351;t&amp;#305;k. Bunu kullanarak, bir veterinerin ameliyathanesi i&amp;#231;in hayvan kategorileri ve hayvan eklemek ve onlar&amp;#305; d&amp;#252;zenlemek i&amp;#231;in formlar&amp;#305; olan basit bir uygulama olu&amp;#351;turmu&amp;#351;tuk. Bu b&amp;#246;l&amp;#252;mde, uygulamam&amp;#305;z&amp;#305; ilerletmek i&amp;#231;in Formtastic&amp;rsquo;in daha geli&amp;#351;mi&amp;#351; &amp;#246;zelliklerinden yararlanaca&amp;#287;&amp;#305;z.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/222/original/E185I01.png" alt="Bir hayvan i&amp;#231;in d&amp;#252;zenleme sayfas&amp;#305;." height="477" width="800"/&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#214;nceki b&amp;#246;l&amp;#252;m&amp;#252;n sonuna geldi&amp;#287;imizde, hayvan olu&amp;#351;turmak ve ayr&amp;#305;nt&amp;#305;lar&amp;#305;n&amp;#305; g&amp;#252;ncelle&amp;#351;tirmek i&amp;#231;in kullanabildi&amp;#287;imiz bir formumuz olmu&amp;#351;tu. Bu b&amp;#246;l&amp;#252;mde forma yeni &amp;#246;zellikler kazand&amp;#305;rmak i&amp;#231;in onu de&amp;#287;i&amp;#351;tirece&amp;#287;iz.&lt;/p&gt;

  &lt;h3&gt;&amp;#199;oktan &amp;#231;o&amp;#287;a (Many-to-Many) &amp;#304;li&amp;#351;kileri &amp;#304;dare Etme&lt;/h3&gt;

  &lt;p&gt;Bir hayvan, veterinerin ameliyathanesine bir&amp;#231;ok hastal&amp;#305;kla gebilir, bu nedenle uygulamam&amp;#305;zda yapmak istedi&amp;#287;imiz ilk de&amp;#287;i&amp;#351;iklik bir &lt;code&gt;Problem&lt;/code&gt; model&amp;rsquo;i eklemek. Bu model, &lt;code&gt;Animal&lt;/code&gt; model&amp;rsquo;iyle &amp;#231;oktan &amp;#231;o&amp;#287;a ili&amp;#351;kiye sahip olacak. &amp;#214;nceki b&amp;#246;l&amp;#252;mde, Formtastic&amp;rsquo;i kategori a&amp;#231;&amp;#305;l&amp;#305;r kutusunu olu&amp;#351;turmak i&amp;#231;in kulland&amp;#305;&amp;#287;&amp;#305;m&amp;#305;zda, onun birden &amp;#231;o&amp;#287;a ili&amp;#351;kileri (one-to-many) ne kadar iyi idare etti&amp;#287;ini g&amp;#246;rm&amp;#252;&amp;#351;t&amp;#252;k. S&amp;#246;ylemeye gerek yok; &amp;#231;oktan &amp;#231;o&amp;#287;a ili&amp;#351;kilerle de ayn&amp;#305; derecede iyi &amp;#231;al&amp;#305;&amp;#351;abiliyor.&lt;/p&gt;

  &lt;p&gt;Problem scaffold&amp;rsquo;unu olu&amp;#351;turmakla ba&amp;#351;layaca&amp;#287;&amp;#305;z. &amp;#214;nceki b&amp;#246;l&amp;#252;mde oldu&amp;#287;u gibi, scaffold&amp;rsquo;u olu&amp;#351;turmay&amp;#305; basitle&amp;#351;tirmek i&amp;#231;in Ryan Bates&amp;rsquo;in &lt;a href="http://github.com/ryanb/nifty-generators"&gt;nifty olu&amp;#351;turucular&amp;#305;n&amp;#305;&lt;/a&gt; kullan&amp;#305;yoruz.&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  script/generate nifty_scaffold problem name:string
  &lt;/pre&gt;
  &lt;p&gt;&amp;#199;oktan &amp;#231;o&amp;#287;a ili&amp;#351;ki olu&amp;#351;turdu&amp;#287;umuz i&amp;#231;in, model&amp;rsquo;leri birle&amp;#351;tirmek i&amp;#231;in ek bir model olu&amp;#351;turaca&amp;#287;&amp;#305;z. Hem &lt;code&gt;Animal&lt;/code&gt; hem de &lt;code&gt;Problem&lt;/code&gt; model&amp;rsquo;ine ba&amp;#287;lanan &lt;code&gt;Symptom&lt;/code&gt; (belirti) adl&amp;#305; bir tane olu&amp;#351;turaca&amp;#287;&amp;#305;z.&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  script/generate nifty_scaffold symptom animal_id:integer problem_id:integer --skip-controller
  &lt;/pre&gt;
  &lt;p&gt;Belirtileri do&amp;#287;rudan web aray&amp;#252;z&amp;#252;nden idare etmeye gerek yok, bu y&amp;#252;zden controller kodunu olu&amp;#351;turmay&amp;#305; atlamak i&amp;#231;in burada &lt;code&gt;--skip-controller&lt;/code&gt; se&amp;#231;ene&amp;#287;ini kullanabiliriz.&lt;/p&gt;

  &lt;p&gt;Bu ad&amp;#305;m&amp;#305; tamamlamak i&amp;#231;in, yeni tablolar&amp;#305; olu&amp;#351;turmak &amp;#252;zere veritaban&amp;#305;m&amp;#305;z&amp;#305;n ge&amp;#231;i&amp;#351;ini yapaca&amp;#287;&amp;#305;z.&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  rake db:migrate
  &lt;/pre&gt;
  &lt;p&gt;Ard&amp;#305;ndan &lt;code&gt;Problem&lt;/code&gt;, &lt;code&gt;Symptom&lt;/code&gt; ve &lt;code&gt;Animal&lt;/code&gt; model&amp;rsquo;lerinin aras&amp;#305;ndaki ba&amp;#287;lant&amp;#305;lar&amp;#305; kurmam&amp;#305;z gerekecek. Bir &lt;code&gt;Problem&lt;/code&gt; , bir&amp;#231;ok &lt;code&gt;Symptom&lt;/code&gt; ve &lt;code&gt;Animal&lt;/code&gt;&amp;rsquo;a sahiptir:&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  class Problem &amp;lt; ActiveRecord::Base
    attr_accessible :name
    has_many :symptoms
    has_many :animals, :through =&amp;gt; :symptoms
  end
  &lt;/pre&gt;
  &lt;p&gt;Bir &lt;code&gt;Symptom&lt;/code&gt;, bir &lt;code&gt;Problem&lt;/code&gt; ve bir &lt;code&gt;Animal&lt;/code&gt;&amp;rsquo;a aittir:&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  class Symptom &amp;lt; ActiveRecord::Base
    attr_accessible :animal_id, :problem_id
    belongs_to :animal
    belongs_to :problem
  end
  &lt;/pre&gt;
  &lt;p&gt;Son olarak bir &lt;code&gt;Animal&lt;/code&gt;, bir&amp;#231;ok &lt;code&gt;Symptom&lt;/code&gt; ve &lt;code&gt;Problem&lt;/code&gt;&amp;rsquo;e sahiptir:&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  class Animal &amp;lt; ActiveRecord::Base
    attr_accessible :name, :category_id, :born_on, :female, :problem_ids
    belongs_to :category
    has_many :symptoms
    has_many :problems, :through =&amp;gt; :symptoms
  end
  &lt;/pre&gt;
  &lt;p&gt;&lt;code&gt;Animal&lt;/code&gt; model&amp;rsquo;imizde yapmam&amp;#305;z gereken ba&amp;#351;ka bir de&amp;#287;i&amp;#351;iklik oldu. Hangi alanlar&amp;#305;n toplu atama (mass assignment) ile g&amp;#252;ncelle&amp;#351;tirilebilece&amp;#287;ini kontrol etmek i&amp;#231;in &lt;code&gt;attr_accessible&lt;/code&gt; &amp;#246;zelli&amp;#287;ini kulland&amp;#305;&amp;#287;&amp;#305;m&amp;#305;zdan, bir hayvana toplu atama ile birden &amp;#231;ok problem atayabilmek ve b&amp;#246;ylece kullan&amp;#305;c&amp;#305; aray&amp;#252;z&amp;#252;nden g&amp;#252;ncelle&amp;#351;tirme yap&amp;#305;lmas&amp;#305;na izin vermek i&amp;#231;in &lt;code&gt;problem_ids&lt;/code&gt; &amp;#246;&amp;#287;esini eri&amp;#351;ilebilen alanlar&amp;#305;n listesine eklememiz gerekiyor.&lt;/p&gt;

  &lt;p&gt;Model&amp;rsquo;lerimizi de&amp;#287;i&amp;#351;tirdi&amp;#287;imize g&amp;#246;re, problemlerin hayvanlara atanabilmesi i&amp;#231;in formu g&amp;#252;ncelle&amp;#351;tirebiliriz. Problemleri &amp;#231;oktan se&amp;#231;meli olarak g&amp;#246;stermek i&amp;#231;in yaln&amp;#305;zca &lt;code&gt;&amp;lt;%= f.input :problems %&amp;gt;&lt;/code&gt; b&amp;#246;l&amp;#252;m&amp;#252;n&amp;#252; hayvan formuna eklememiz gerekiyor.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;% semantic_form_for @animal do |f| %&amp;gt;
    &amp;lt;% f.inputs do %&amp;gt;
      &amp;lt;%= f.input :name %&amp;gt;
      &amp;lt;%= f.input :born_on, :start_year =&amp;gt; 1900 %&amp;gt;
      &amp;lt;%= f.input :category, :include_blank =&amp;gt; false %&amp;gt;
      &amp;lt;%= f.input :female, :as =&amp;gt; :radio, :label =&amp;gt; &amp;quot;Gender&amp;quot;, :collection =&amp;gt; [[&amp;quot;Male&amp;quot;, false], [&amp;quot;Female&amp;quot;, true]] %&amp;gt;
      &amp;lt;%= f.input :problems %&amp;gt;
    &amp;lt;% end %&amp;gt;
    &amp;lt;%= f.buttons %&amp;gt;
  &amp;lt;% end %&amp;gt;
  &lt;/pre&gt;
  &lt;p&gt;&amp;#350;imdi sayfay&amp;#305; yeniden y&amp;#252;klersek, problemlerin listesini formda g&amp;#246;rebiliriz. (Veritaban&amp;#305;na &amp;#246;nceden birka&amp;#231; problem eklemi&amp;#351;tik, bu nedenle g&amp;#246;sterilecek bir &amp;#351;eyler bulunuyor.) Birka&amp;#231; problem se&amp;#231;er ve hayvan&amp;#305;m&amp;#305;z&amp;#305; kaydedersek, hayvan&amp;#305; d&amp;#252;zenlemeye geri geldi&amp;#287;imizde onlar&amp;#305;n se&amp;#231;ili oldu&amp;#287;unu g&amp;#246;rece&amp;#287;iz.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/223/original/E185I02.png" alt="Problemler &amp;#231;oktan se&amp;#231;meli olarak listeleniyor." height="588" width="800"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Problemleri &amp;#231;oktan se&amp;#231;meli yerine bir dizi onay kutusu halinde g&amp;#246;stermek istiyoruz. Son defas&amp;#305;nda Formtastic&amp;rsquo;in :as se&amp;#231;ene&amp;#287;ini kullanarak onay kutular&amp;#305;n&amp;#305; radyo d&amp;#252;&amp;#287;meleriyle de&amp;#287;i&amp;#351;tirmi&amp;#351;tik. Listeyi onay kutular&amp;#305; olarak g&amp;#246;stermek i&amp;#231;in burada ayn&amp;#305;s&amp;#305;n&amp;#305; yapabiliriz.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;%= f.input :problems, :as =&amp;gt; :check_boxes %&amp;gt;
  &lt;/pre&gt;
  &lt;p&gt;Sayfay&amp;#305; bir daha yeniledi&amp;#287;imizde problemler onay kutular&amp;#305; halinde g&amp;#246;sterilir ve &amp;#231;oktan se&amp;#231;melide &amp;#246;nceden se&amp;#231;ti&amp;#287;imiz &amp;#246;&amp;#287;eler i&amp;#351;aretli olarak gelir.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/224/original/E185I03.png" alt="Problemler art&#305;k onay kutusu listesi olarak g&amp;#246;steriliyor." height="583" width="800"/&gt;
  &lt;/div&gt;

  &lt;h3&gt;Zorunlu Alanlarla &amp;#199;al&amp;#305;&amp;#351;ma&lt;/h3&gt;

  &lt;p&gt;Yukar&amp;#305;daki her alan&amp;#305;n etiketinin yan&amp;#305;nda, o alan&amp;#305;n zorunlu oldu&amp;#287;unu belirten bir y&amp;#305;ld&amp;#305;z i&amp;#351;areti bulunmaktad&amp;#305;r. Varsay&amp;#305;lan olarak, Formtastic her alan&amp;#305; zorunlu yapar. &lt;code&gt;:required&lt;/code&gt; se&amp;#231;ene&amp;#287;ini kullanarak bunu tek bir alan i&amp;#231;in ge&amp;#231;ersiz k&amp;#305;labiliriz.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;%= f.input :problems, :as =&amp;gt; :check_boxes, :required =&amp;gt; false %&amp;gt;
  &lt;/pre&gt;
  &lt;p&gt;Bunu her alan i&amp;#231;in kontrol etmek zahmetli hale gelebilir; hangi alanlar&amp;#305;n zorunlu oldu&amp;#287;unu kontrol etmek i&amp;#231;in model&amp;rsquo;lerin do&amp;#287;rulamalar&amp;#305;n&amp;#305; kullanabilseydik &amp;#231;ok daha kolay olurdu. Formtastic bunu desteklemektedir, ancak bundan yararlanmak i&amp;#231;in &amp;#246;ncelikle &lt;a href="http://github.com/redinger/validation_reflection"&gt;validation_reflection&lt;/a&gt; adl&amp;#305; bir eklentiyi y&amp;#252;klememiz gerekir.&lt;/p&gt;

  &lt;p&gt;Eklentiyi uygulamam&amp;#305;za GitHub&amp;rsquo;dan y&amp;#252;kleyebiliriz.&lt;/p&gt;
  &lt;pre class="terminal"&gt;  script/plugin install git://github.com/redinger/validation_reflection.git
  &lt;/pre&gt;
  &lt;p&gt;validation_reflection
y&amp;#252;klendikten sonra, eklentinin &amp;#231;al&amp;#305;&amp;#351;t&amp;#305;r&amp;#305;lmas&amp;#305; i&amp;#231;in sunucumuzu yeniden
ba&amp;#351;latmam&amp;#305;z gerekir. Daha sonra sayfay&amp;#305; yeniden y&amp;#252;klersek, y&amp;#305;ld&amp;#305;z
i&amp;#351;aretlerinin gitti&amp;#287;ini g&amp;#246;r&amp;#252;r&amp;#252;z. Bu, Animal model&amp;rsquo;indeki alanlar&amp;#305;n hi&amp;#231;birinin do&amp;#287;rulamas&amp;#305;n&amp;#305;n olmamas&amp;#305;ndand&amp;#305;r.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/225/original/E185I04.png" alt="Zorunlu alan i&amp;#351;aretleri art&amp;#305;k g&amp;#246;sterilmiyor." height="583" width="800"/&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#350;imdi &lt;code&gt;name&lt;/code&gt; ve &lt;code&gt;born_on&lt;/code&gt; &amp;#246;zelliklerine do&amp;#287;rulama ekleyerek onlar&amp;#305;n zorunlu olmas&amp;#305;n&amp;#305; sa&amp;#287;layabiliriz&amp;hellip;&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  class Animal &amp;lt; ActiveRecord::Base
    attr_accessible :name, :category_id, :born_on, :female, :problem_ids
    belongs_to :category
    has_many :symptoms
    has_many :problems, :through =&amp;gt; :symptoms
    validates_presence_of :name, :born_on
  end
  &lt;/pre&gt;
  &lt;p&gt;&amp;hellip;ve formu tekrar y&amp;#252;klersek y&amp;#305;ld&amp;#305;z i&amp;#351;aretleri o alanlar&amp;#305;n etiketlerinin yan&amp;#305;na geri gelecektir.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/226/original/E185I05.png" alt="Model do&amp;#287;rulamalar&amp;#305; nedeniyle ilk iki alan art&amp;#305;k zorunlu." height="582" width="800"/&gt;
  &lt;/div&gt;

  &lt;h3&gt;Formtastic Hata Mesajlar&amp;#305;n&amp;#305; Nas&amp;#305;l &amp;#304;dare Eder&lt;/h3&gt;

  &lt;p&gt;Formtastic, bir formun hata mesajlar&amp;#305;n&amp;#305; her alan&amp;#305;n yan&amp;#305;nda sat&amp;#305;r aras&amp;#305;nda g&amp;#246;sterir. Hayvan&amp;#305;m&amp;#305;z&amp;#305;n ad&amp;#305;n&amp;#305; silersek ve ard&amp;#305;ndan kaydetmeye &amp;#231;al&amp;#305;&amp;#351;&amp;#305;rsak varsay&amp;#305;lan hata iletisi g&amp;#246;sterilir.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/227/original/E185I06.png" alt="Alan&amp;#305;n alt&amp;#305;nda yer alan varsay&amp;#305;lan do&amp;#287;rulama metni." height="280" width="797"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Gerekirse, Formtastic&amp;rsquo;in yap&amp;#305;land&amp;#305;rmas&amp;#305;nda de&amp;#287;i&amp;#351;iklik yap&amp;#305;larak bu davran&amp;#305;&amp;#351; de&amp;#287;i&amp;#351;tirilebilir.&lt;/p&gt;

  
&lt;p&gt;En iyisi yap&amp;#305;land&amp;#305;rma ayr&amp;#305;nt&amp;#305;lar&amp;#305;n&amp;#305; &lt;code&gt;/config/initializers&lt;/code&gt; dizinine koymakt&amp;#305;r. Bu dosyaya &lt;code&gt;formtastic_config.rb&lt;/code&gt; ad&amp;#305;n&amp;#305; verece&amp;#287;iz.&amp;nbsp;&lt;a href="http://github.com/justinfrench/formtastic"&gt;Formtastic GitHub sayfas&amp;#305;nda&lt;/a&gt; yap&amp;#305;land&amp;#305;rma dosyas&amp;#305;na yerle&amp;#351;tirilebilecekler hakk&amp;#305;nda ayr&amp;#305;nt&amp;#305;lar ve g&amp;#246;r&amp;#252;lebilecek bir&amp;nbsp;&lt;a href="http://github.com/justinfrench/formtastic/blob/master/generators/formtastic/templates/formtastic.rb"&gt;&amp;#246;rnek dosya&lt;/a&gt; bulunmaktad&amp;#305;r. Orada listelenen yap&amp;#305;land&amp;#305;rma se&amp;#231;eneklerinden biri, formun hatalar&amp;#305;n&amp;#305;n nerede g&amp;#246;sterildi&amp;#287;ini de&amp;#287;i&amp;#351;tirmek i&amp;#231;in gereken &lt;code&gt;inline_errors&lt;/code&gt; se&amp;#231;ene&amp;#287;idir. Hatalar&amp;#305; gizlemek i&amp;#231;in yap&amp;#305;land&amp;#305;rma dosyas&amp;#305;nda &lt;code&gt;inline_errors&lt;/code&gt; se&amp;#231;ene&amp;#287;ini &lt;code&gt;:none&lt;/code&gt; olarak ayarlayabiliriz.&lt;/p&gt;

  &lt;pre class="ruby"&gt;Formtastic::SemanticFormBuilder.inline_errors = :none&lt;/pre&gt;
  
&lt;p&gt;Art&amp;#305;k ge&amp;#231;ersiz bir formu g&amp;#246;ndermeye &amp;#231;al&amp;#305;&amp;#351;t&amp;#305;&amp;#287;&amp;#305;m&amp;#305;zda form sayfas&amp;#305;na
geri g&amp;#246;nderilece&amp;#287;iz ama hi&amp;#231;bir hata g&amp;#246;sterilmeyecek. Hatalar&amp;#305; formun
tepesinde bir liste halinde g&amp;#246;r&amp;#252;nt&amp;#252;lemek istersek, hatalar&amp;#305; &#8220;klasik&#8221; Rails yoluyla g&amp;#246;stermek i&amp;#231;in  &lt;code&gt;error_messages&lt;/code&gt; metodunu kullanabiliriz.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;% semantic_form_for @animal do |f| %&amp;gt;
    &amp;lt;%= f.error_messages %&amp;gt;
    &amp;lt;% f.inputs do %&amp;gt;
    &amp;lt;!-- rest of form --&amp;gt;
  &lt;/pre&gt;
  &lt;p&gt;Form hatalar&amp;#305; art&amp;#305;k formun tepesinde g&amp;#246;sterilecektir.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/228/original/E185I07.png" alt="Hatalar art&amp;#305;k formun tepesinde g&amp;#246;steriliyor." height="380" width="790"/&gt;
  &lt;/div&gt;

  &lt;h3&gt;&amp;#304;pu&amp;#231;lar&amp;#305;&lt;/h3&gt;

  &lt;p&gt;G&amp;#246;sterece&amp;#287;imiz bir Formtastic alan se&amp;#231;ene&amp;#287;i daha var: &lt;code&gt;:hint&lt;/code&gt; (ipucu). Ad&amp;#305;ndan da anla&amp;#351;&amp;#305;laca&amp;#287;&amp;#305; gibi, &lt;code&gt;:hint&lt;/code&gt; alan&amp;#305;n yan&amp;#305;nda bir ipucu g&amp;#246;sterir. Alan&amp;#305;n ad&amp;#305;na bir ipucu eklemek i&amp;#231;in yaln&amp;#305;zca uygun bir ipucu mesaj&amp;#305; eklememiz gerekmektedir.&lt;/p&gt;

  &lt;pre class="ruby"&gt;&amp;lt;%= f.input :name, :hint =&amp;gt; &amp;quot;Enter the owner&amp;amp;rsquo;s name if none is provided.&amp;quot; %&amp;gt;&lt;/pre&gt;
  &lt;p&gt;&amp;#350;imdi sayfay&amp;#305; yeniden y&amp;#252;kledi&amp;#287;imizde ipucu mesaj&amp;#305; form alan&amp;#305;n&amp;#305;n alt&amp;#305;nda g&amp;#246;sterilecektir.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/229/original/E185I08.png" alt="Alan&amp;#305;n alt&amp;#305;nda g&amp;#246;sterilen ipucu." height="286" width="816"/&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#304;pucu mesaj&amp;#305;n&amp;#305;n veya formun ba&amp;#351;ka b&amp;#246;l&amp;#252;mlerinin stilini de&amp;#287;i&amp;#351;tirmek istersek, bir &amp;#246;nceki b&amp;#246;l&amp;#252;mde&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  script/generate formtastic_stylesheets
  &lt;/pre&gt;
  &lt;p&gt;komutunu &amp;#231;al&amp;#305;&amp;#351;t&amp;#305;rd&amp;#305;&amp;#287;&amp;#305;m&amp;#305;zda Formtastic&amp;rsquo;in olu&amp;#351;turdu&amp;#287;u &lt;code&gt;formtastic_changes.css&lt;/code&gt; dosyas&amp;#305;n&amp;#305; de&amp;#287;i&amp;#351;tirerek bunu yapabiliriz. Dosyan&amp;#305;n i&amp;#231;inde
ipucu metninin stilinin nas&amp;#305;l de&amp;#287;i&amp;#351;tirilece&amp;#287;ini g&amp;#246;steren i&amp;#351;e yarar bir
yorum b&amp;#246;l&amp;#252;m&amp;#252; bulunmaktad&amp;#305;r. &amp;#304;pucu metninin 11px boyutunda ve italik
olmas&amp;#305;n&amp;#305; istersek &amp;#351;u CSS&amp;rsquo;yi kullanarak bunu yapabiliriz:&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  form.formtastic fieldset ol li p.inline-hints { 
    font-style: italic;
    font-size: 11px;
  }
  &lt;/pre&gt;
  &lt;p&gt;Formu tekrar y&amp;#252;klersek ipucu metni de&amp;#287;i&amp;#351;mi&amp;#351; olacakt&amp;#305;r.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/230/original/E185I09.png" alt="&amp;#304;pucumuzun art&amp;#305;k stili var." height="286" width="816"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Formun g&amp;#246;r&amp;#252;n&amp;#252;m&amp;#252;nde ba&amp;#351;ka de&amp;#287;i&amp;#351;iklikler yapmak istersek, varsay&amp;#305;lan stillerin nas&amp;#305;l tan&amp;#305;mland&amp;#305;&amp;#287;&amp;#305;n&amp;#305; g&amp;#246;rmek i&amp;#231;in &lt;code&gt;formtastic.css&lt;/code&gt; dosyas&amp;#305;na bakmak en iyi yoldur. Ard&amp;#305;ndan varsay&amp;#305;lanlar&amp;#305; ge&amp;#231;ersiz k&amp;#305;lmak i&amp;#231;in &lt;code&gt;formtastic_changes.css&lt;/code&gt; dosyas&amp;#305;nda benzer se&amp;#231;icileri (selector) kullanabiliriz.&lt;/p&gt;

  
&lt;p&gt;Bu b&amp;#246;l&amp;#252;ml&amp;#252;k bu kadar. Formtastic&amp;rsquo;i kendi uygulamalar&amp;#305;n&amp;#305;zda denemeniz i&amp;#231;in sizi ikna edecek kadar bilgi verebildi&amp;#287;imizi umuyoruz. Bu iki b&amp;#246;l&amp;#252;m boyunca i&amp;#351;leyemedi&amp;#287;imiz birka&amp;#231; &amp;#246;zellik bulunuyor. Formtastic belgeleri t&amp;#252;m &amp;#246;zellikleri kaps&amp;#305;yor ve yerelle&amp;#351;tirme deste&amp;#287;i dahil olmak &amp;#252;zere daha fazla bilgi i&amp;#231;in bakmaya de&amp;#287;er.&lt;/p&gt;</description>
      <pubDate>Mon, 30 Nov 2009 21:56:04 +0000</pubDate>
      <guid>http://tr.asciicasts.com/episodes/185-formtastic-bolum-2</guid>
      <link>http://tr.asciicasts.com/episodes/185-formtastic-bolum-2</link>
    </item>
    <item>
      <title>Formtastic B&#246;l&#252;m 1</title>
      <description>&lt;p&gt;Formlar&amp;#305;n view kodunu yazmay&amp;#305; uzun ve s&amp;#305;k&amp;#305;c&amp;#305; buluyorsan&amp;#305;z, bunu yapmak i&amp;#231;in daha k&amp;#305;sa bir yol sa&amp;#287;layan &lt;a href="http://github.com/justinfrench/formtastic"&gt;Formtastic&lt;/a&gt; adl&amp;#305; bir gem&amp;rsquo;in oldu&amp;#287;unu &amp;#246;&amp;#287;renmek sizi sevindirecektir. Bununla, bu b&amp;#246;l&amp;#252;mde g&amp;#246;sterece&amp;#287;imiz gibi nispeten ufak bir kodla olduk&amp;#231;a karma&amp;#351;&amp;#305;k formlar olu&amp;#351;turulabiliyor.&lt;/p&gt;

  &lt;h3&gt;Veteriner Uygulamas&amp;#305;n&amp;#305; Olu&amp;#351;turma&lt;/h3&gt;

  &lt;p&gt;Formtastic&amp;rsquo;e ba&amp;#351;lamadan &amp;#246;nce, kullanabilece&amp;#287;iniz bir &lt;a href="http://github.com/grimen/formtastic_tmbundle"&gt;TextMate paketinden&lt;/a&gt; bahsetmek yerinde olacakt&amp;#305;r. Bu paket, form olu&amp;#351;turmay&amp;#305; daha da kolayla&amp;#351;t&amp;#305;rabilecek bir&amp;#231;ok yararl&amp;#305; kod par&amp;#231;ac&amp;#305;&amp;#287;&amp;#305; sa&amp;#287;lamaktad&amp;#305;r. &lt;/p&gt;

  &lt;p&gt;Formtastic&amp;rsquo;i tan&amp;#305;tmak i&amp;#231;in yeni bir Rails uygulamas&amp;#305; olu&amp;#351;turaca&amp;#287;&amp;#305;z. Bu uygulama bir veterinerin ameliyathanesindeki hasta hayvanlar&amp;#305;n takibini yapacak, bu y&amp;#252;zden ona &lt;code&gt;vet&lt;/code&gt; ad&amp;#305;n&amp;#305; veriyoruz ve normal yolla uygulamay&amp;#305; olu&amp;#351;turuyoruz.&lt;/p&gt;
  &lt;pre class="terminal"&gt;rails vet&lt;/pre&gt;
  &lt;p&gt;Formtastic bir gem olarak sa&amp;#287;lanmaktad&amp;#305;r. Uygulamam&amp;#305;z&amp;#305;n &lt;code&gt;/config/environment.rb&lt;/code&gt; dosyas&amp;#305;na a&amp;#351;a&amp;#287;&amp;#305;daki sat&amp;#305;r&amp;#305; ekleyerek onu uygulamam&amp;#305;za dahil edebiliriz. (TextMate kullan&amp;#305;yorsan&amp;#305;z ve Formtastic paketini y&amp;#252;klediyseniz &lt;code&gt;ftgem&lt;/code&gt; ve &lt;code&gt;&amp;lt;TAB&amp;gt;&lt;/code&gt; tu&amp;#351;lar&amp;#305;n&amp;#305; k&amp;#305;sayol olarak kullanabilirsiniz).&lt;/p&gt;

  &lt;pre class="ruby"&gt;config.gem &amp;#x27;justinfrench-formtastic&amp;#x27;, :lib =&amp;gt; &amp;#x27;formtastic&amp;#x27;, :source =&amp;gt; &amp;#x27;http://gems.github.com&amp;#x27;&lt;/pre&gt;
&lt;p&gt;Gem&amp;rsquo;in y&amp;#252;klendi&amp;#287;inden emin olmak i&amp;#231;in &amp;#351;u komutu &amp;#231;al&amp;#305;&amp;#351;t&amp;#305;rmam&amp;#305;z yeterlidir:&lt;/p&gt; 
  &lt;pre class="terminal"&gt;
  sudo rake gems:install
  &lt;/pre&gt;
  &lt;p&gt;B&amp;#246;ylece uygulamam&amp;#305;z&amp;#305; yazmaya ba&amp;#351;lamak i&amp;#231;in haz&amp;#305;r&amp;#305;z.&lt;/p&gt;

  &lt;p&gt;Uygulamam&amp;#305;z&amp;#305;n par&amp;#231;alar&amp;#305;n&amp;#305; yazmay&amp;#305; kolayla&amp;#351;t&amp;#305;rmak i&amp;#231;in, Ryan Bates&amp;rsquo;in &lt;a href="http://github.com/ryanb/nifty-generators"&gt;nifty olu&amp;#351;turucular&amp;#305;n&amp;#305;n&lt;/a&gt; baz&amp;#305;lar&amp;#305;ndan yararlanaca&amp;#287;&amp;#305;z. &amp;#304;lk &amp;#246;nce  &lt;code&gt;nifty_layout&lt;/code&gt; olu&amp;#351;turucusunu kullanarak bir yerle&amp;#351;im (layout) dosyas&amp;#305; ve bir stil sayfas&amp;#305; olu&amp;#351;turaca&amp;#287;&amp;#305;z.&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  script/generate nifty_layout
  &lt;/pre&gt;
  &lt;p&gt;Daha sonra, &lt;code&gt;nifty_scaffold&lt;/code&gt; olu&amp;#351;turucusundan yararlanarak ilk model&amp;rsquo;imizi ve ona e&amp;#351;lik edecek bir controller&amp;rsquo;&amp;#305; ve view&amp;rsquo;lar&amp;#305; olu&amp;#351;turaca&amp;#287;&amp;#305;z. Hayvanlar&amp;#305;m&amp;#305;z&amp;#305; kategorilere g&amp;#246;re ay&amp;#305;raca&amp;#287;&amp;#305;z, bu nedenle model&amp;rsquo;imize &lt;code&gt;Category&lt;/code&gt; ad&amp;#305;n&amp;#305; verece&amp;#287;iz ve &lt;code&gt;name&lt;/code&gt; ile &lt;code&gt;description&lt;/code&gt; &amp;#246;&amp;#287;eleri ekleyece&amp;#287;iz.&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  script/generate nifty_scaffold category name:string description:text
  &lt;/pre&gt;
  &lt;p&gt;&amp;#350;imdi veritaban&amp;#305;m&amp;#305;z&amp;#305;n ge&amp;#231;i&amp;#351;ini yapabiliriz.&lt;/p&gt;
  &lt;pre class="terminal"&gt;rake db:migrate&lt;/pre&gt;
  &lt;p&gt;Yeni uygulamam&amp;#305;z&amp;#305; ba&amp;#351;lat&amp;#305;r ve yeni kategori sayfas&amp;#305;na gidersek scaffold (iskelet olu&amp;#351;turma sistemi) taraf&amp;#305;ndan olu&amp;#351;turulan view kodunu g&amp;#246;rece&amp;#287;iz.&lt;/p&gt;
  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/214/original/E184I01.png" alt="Varsay&amp;#305;lan Yeni Kategori sayfas&amp;#305;." height="439" width="800"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Scaffold taraf&amp;#305;ndan yukar&amp;#305;daki form i&amp;#231;in olu&amp;#351;turulan kod a&amp;#351;a&amp;#287;&amp;#305;daki gibidir:&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;% form_for @category do |f| %&amp;gt;
    &amp;lt;%= f.error_messages %&amp;gt;
    &amp;lt;p&amp;gt;

      &amp;lt;%= f.label :name %&amp;gt;&amp;lt;br /&amp;gt;
      &amp;lt;%= f.text_field :name %&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
      &amp;lt;%= f.label :description %&amp;gt;&amp;lt;br /&amp;gt;

      &amp;lt;%= f.text_area :description, :rows =&amp;gt; 5 %&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;&amp;lt;%= f.submit &amp;quot;Submit&amp;quot; %&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;% end %&amp;gt;
  &lt;/pre&gt;
  &lt;p&gt;Bu normal Rails form kodudur; bir &lt;code&gt;form_for&lt;/code&gt; ile ba&amp;#351;lar ve formdaki her alan kendi etiketiyle birlikte ayr&amp;#305; ayr&amp;#305; tan&amp;#305;mlan&amp;#305;r. En sonda, yeni bir kategori eklememizi sa&amp;#287;layan bir g&amp;#246;nder d&amp;#252;&amp;#287;mesi bulunmaktad&amp;#305;r.&lt;/p&gt;

  &lt;p&gt;Formtastic bu standart form metodlar&amp;#305;n&amp;#305;n hi&amp;#231;birini ge&amp;#231;ersiz k&amp;#305;lmaz, b&amp;#246;ylece bunlar&amp;#305; bir Formtastic formunda da kullanabiliriz. Yukar&amp;#305;daki formda bulunan &lt;code&gt;form_for&lt;/code&gt; &amp;#246;&amp;#287;esini Formtastic&amp;rsquo;in &lt;code&gt;semantic_form_for&lt;/code&gt; &amp;#246;&amp;#287;esiyle de&amp;#287;i&amp;#351;tirseydik form hala ayn&amp;#305; &amp;#351;ekilde &amp;#231;al&amp;#305;&amp;#351;&amp;#305;rd&amp;#305;. Ama bunu yapmak anlams&amp;#305;z olurdu, &amp;#231;&amp;#252;nk&amp;#252; as&amp;#305;l kolayl&amp;#305;k Formtastic&amp;rsquo;in form metodlar&amp;#305;n&amp;#305; kulland&amp;#305;&amp;#287;&amp;#305;m&amp;#305;zda ortaya &amp;#231;&amp;#305;kar. Onlar&amp;#305; kullanarak, formumuzu a&amp;#351;a&amp;#287;&amp;#305;daki gibi yapabiliriz:&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;% semantic_form_for @category do |f| %&amp;gt;
   &amp;lt;%= f.inputs %&amp;gt;
   &amp;lt;%= f.buttons %&amp;gt;
  &amp;lt;% end %&amp;gt;
  &lt;/pre&gt;

  &lt;p&gt;&lt;code&gt;inputs&lt;/code&gt; metodu bir model&amp;rsquo;in t&amp;#252;m giri&amp;#351; alanlar&amp;#305;n&amp;#305; olu&amp;#351;turmak i&amp;#231;in kullan&amp;#305;&amp;#351;l&amp;#305; bir yoldur ve ayn&amp;#305; &amp;#351;ekilde &lt;code&gt;buttons&lt;/code&gt; metodu bir g&amp;#246;nder d&amp;#252;&amp;#287;mesi olu&amp;#351;turur. Formu &amp;#351;imdi yeniden y&amp;#252;klersek biraz farkl&amp;#305; g&amp;#246;r&amp;#252;necektir.&lt;/p&gt;
  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/215/original/E184I02.png" alt="Formtastic kodu kullanan Yeni Kategori sayfas&amp;#305;." height="502" width="801"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Bu form art&amp;#305;k Formtastic&amp;rsquo;in metodlar&amp;#305; kullan&amp;#305;larak g&amp;#246;sterilmektedir. &amp;#304;lk g&amp;#246;r&amp;#252;len farkl&amp;#305;l&amp;#305;k; scaffold&amp;rsquo;un olu&amp;#351;turdu&amp;#287;u formda alanlar&amp;#305;n aras&amp;#305;nda paragraf etiketleri kullan&amp;#305;l&amp;#305;rken, Formtastic&amp;rsquo;in giri&amp;#351; alanlar&amp;#305;n&amp;#305; d&amp;#252;&amp;#287;meden ay&amp;#305;rmak i&amp;#231;in s&amp;#305;ral&amp;#305; listeleri ve fieldset etiketlerini kullanmas&amp;#305;d&amp;#305;r.&lt;/p&gt;

  &lt;p&gt;Form &amp;#351;u andaki haliyle pek g&amp;#252;zel g&amp;#246;r&amp;#252;nm&amp;#252;yor, ancak biraz CSS uygulayarak bunu halledebiliriz. Formtastic, bu i&amp;#351;i kendi kendimize yapmak zorunda kalmamak i&amp;#231;in kullanabilece&amp;#287;imiz baz&amp;#305; stil sayfalar&amp;#305;yla birlikte gelir. &amp;#350;unu &amp;#231;al&amp;#305;&amp;#351;t&amp;#305;r&amp;#305;rsak:&lt;/p&gt;
  &lt;pre class="terminal"&gt;  script/generate formtastic_stylesheets
  &lt;/pre&gt;
  &lt;p&gt;uygulamam&amp;#305;z&amp;#305;n &lt;code&gt;/public/stylesheets&lt;/code&gt;
dizininde iki yeni stil sayfas&amp;#305; olu&amp;#351;turulur ve ard&amp;#305;ndan bu stil
sayfalar&amp;#305;n&amp;#305; yerle&amp;#351;im dosyam&amp;#305;za ekleyebiliriz. Yerle&amp;#351;imimizin "head"
b&amp;#246;l&amp;#252;m&amp;#252;nde zaten bir stil sayfas&amp;#305;n&amp;#305; eklemi&amp;#351; durumday&amp;#305;z.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;%= h(yield(:title) || &amp;quot;Untitled&amp;quot;) %&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;%= stylesheet_link_tag &amp;#x27;application&amp;#x27; %&amp;gt;
    &amp;lt;%= yield(:head) %&amp;gt;
  &amp;lt;/head&amp;gt;
  &lt;/pre&gt;

  &lt;p&gt;Formtastic stil sayfalar&amp;#305;n&amp;#305; buraya ekleyerek onlar&amp;#305; uygulamam&amp;#305;zdaki her sayfaya dahil edebiliriz.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;%= stylesheet_link_tag &amp;#x27;application&amp;#x27;, &amp;#x27;formtastic&amp;#x27;, &amp;#x27;formtastic_changes&amp;#x27; %&amp;gt;
  &lt;/pre&gt;

&lt;p&gt;&amp;#304;kinci dosya, &lt;code&gt;formtastic_changes&lt;/code&gt;, di&amp;#287;er stil sayfas&amp;#305;ndaki varsay&amp;#305;lan stillerde yapmak istedi&amp;#287;imiz de&amp;#287;i&amp;#351;iklikleri yapmam&amp;#305;z gereken yerdir. Art&amp;#305;k birden &amp;#231;ok stil sayfam&amp;#305;z oldu&amp;#287;u i&amp;#231;in, Rails&amp;rsquo;in &amp;#246;nbelle&amp;#287;e alma se&amp;#231;ene&amp;#287;inden yararlanmal&amp;#305;y&amp;#305;z. B&amp;#246;ylece uygulama production (&amp;#252;retim) modunda &amp;#231;al&amp;#305;&amp;#351;t&amp;#305;r&amp;#305;ld&amp;#305;&amp;#287;&amp;#305;nda dosyalar tek bir dosyada birle&amp;#351;tirilir. (Bu birden &amp;#231;ok JavaScript dosyas&amp;#305; i&amp;#231;in de ge&amp;#231;erlidir.)&lt;/p&gt;

  &lt;pre class="ruby"&gt;
  &amp;lt;%= stylesheet_link_tag &amp;#x27;application&amp;#x27;, &amp;#x27;formtastic&amp;#x27;, &amp;#x27;formtastic_changes&amp;#x27;, :cache =&amp;gt; &amp;#x27;base&amp;#x27; %&amp;gt;
  &lt;/pre&gt;
  &lt;p&gt;&amp;#214;nbelle&amp;#287;e almay&amp;#305; bu &amp;#351;ekilde kullanmak; &amp;#252;&amp;#231; stil sayfas&amp;#305; dosyas&amp;#305; &lt;code&gt;base.css&lt;/code&gt; adl&amp;#305; bir dosyada birle&amp;#351;tirilece&amp;#287;inden, sayfa y&amp;#252;klenirken daha az say&amp;#305;da dosyan&amp;#305;n sunucudan istenece&amp;#287;i anlam&amp;#305;na gelir.&lt;/p&gt;

  &lt;p&gt;&amp;#350;imdi formu yeniden y&amp;#252;klersek biraz daha iyi g&amp;#246;r&amp;#252;necektir, ancak hala g&amp;#246;r&amp;#252;nmesi gerekti&amp;#287;i gibi de&amp;#287;il.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/216/original/E184I03.png" alt="Formun yerle&amp;#351;imi pek d&amp;#252;zg&amp;#252;n de&amp;#287;il." height="475" width="800"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Bu, Formtastic&amp;rsquo;in stil sayfas&amp;#305;ndaki birka&amp;#231; sat&amp;#305;r nedeniyledir.&lt;/p&gt;
  &lt;pre class="terminal"&gt;  html[xmlns] form.formtastic fieldset { display: block; }

  html[xmlns] form.formtastic fieldset ol li { display: block; }
  &lt;/pre&gt;

  &lt;p&gt;Yukar&amp;#305;daki iki CSS se&amp;#231;icisi (selector) sayfalar&amp;#305;n a&amp;#231;&amp;#305;l&amp;#305;&amp;#351; &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; etiketinin bir &lt;code&gt;xmlns&lt;/code&gt;
&amp;#246;zniteli&amp;#287;ine sahip olmas&amp;#305;n&amp;#305; beklemektedir. nifty_layout olu&amp;#351;turucusu
taraf&amp;#305;ndan olu&amp;#351;turulan yerle&amp;#351;im dosyas&amp;#305;ndaki etikette bu yoktur, bu
nedenle formun olmas&amp;#305; gerekti&amp;#287;i gibi g&amp;#246;r&amp;#252;nmesi i&amp;#231;in bunu eklememiz
gerekecektir.&lt;/p&gt;
  &lt;pre class="terminal"&gt;  &amp;lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&amp;gt;
  &lt;/pre&gt;
  &lt;p&gt;&amp;#350;imdi
formu yeniden y&amp;#252;kledi&amp;#287;imizde metin kutular&amp;#305;n&amp;#305;n bekledi&amp;#287;imiz gibi
hizaland&amp;#305;&amp;#287;&amp;#305;n&amp;#305; g&amp;#246;rebiliriz. Formun olmas&amp;#305; gerekti&amp;#287;i gibi g&amp;#246;r&amp;#252;nmesini
sa&amp;#287;lad&amp;#305;&amp;#287;&amp;#305;m&amp;#305;za g&amp;#246;re, k&amp;#246;pekler i&amp;#231;in bir tane ve kediler i&amp;#231;in bir tane olmak
&amp;#252;zere bir &amp;#231;ift kategori ekleyebiliriz. Bunlar&amp;#305; birazdan hayvanlar&amp;#305;n
kendileri i&amp;#231;in formu olu&amp;#351;tururken kullanaca&amp;#287;&amp;#305;z.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/217/original/E184I04.png" alt="&amp;#304;lk kategorimizi ekliyoruz." height="475" width="800"/&gt;
  &lt;/div&gt;

  &lt;h3&gt;Daha Karma&amp;#351;&amp;#305;k Bir &amp;#214;rnek&lt;/h3&gt;

  &lt;p&gt;&amp;#350;imdi hayvanlar i&amp;#231;in olan formla devam edece&amp;#287;iz. Kategorilerde yapt&amp;#305;&amp;#287;&amp;#305;m&amp;#305;z gibi bir scaffold olu&amp;#351;turarak ba&amp;#351;layaca&amp;#287;&amp;#305;z.&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  script/generate nifty_scaffold animal name:string category_id:integer born_on:date female:boolean
  &lt;/pre&gt;
  &lt;p&gt;&lt;code&gt;Animal&lt;/code&gt; model&amp;rsquo;inde &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;born_on&lt;/code&gt; ve &lt;code&gt;female&lt;/code&gt; &amp;#246;&amp;#287;elerinin yan&amp;#305;s&amp;#305;ra bir &lt;code&gt;category_id&lt;/code&gt; olacak, b&amp;#246;ylece her hayvan&amp;#305; bir &lt;code&gt;Category&lt;/code&gt; i&amp;#231;ine yerle&amp;#351;tirebilece&amp;#287;iz. Scaffold&amp;rsquo;u olu&amp;#351;turduktan sonra, yeni tablonun veritaban&amp;#305;nda olu&amp;#351;turulmas&amp;#305; i&amp;#231;in veritaban&amp;#305;m&amp;#305;z&amp;#305;n ge&amp;#231;i&amp;#351;ini yapaca&amp;#287;&amp;#305;z.&lt;/p&gt;
  &lt;pre class="terminal"&gt;
  rake db:migrate
  &lt;/pre&gt;
  &lt;p&gt;Sonraki ad&amp;#305;m model&amp;rsquo;ler aras&amp;#305;ndaki ili&amp;#351;kiyi kurarak bir hayvan&amp;#305;n bir kategoriye ait olmas&amp;#305;n&amp;#305;&#8230;&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  class Animal &amp;lt; ActiveRecord::Base
    attr_accessible :name, :category_id, :born_on, :female
    belongs_to :category
  end
  &lt;/pre&gt;
  &lt;p&gt;&amp;hellip;ve bir kategoride birden fazla hayvan olmas&amp;#305;n&amp;#305; sa&amp;#287;lamak.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  class Category &amp;lt; ActiveRecord::Base
    attr_accessible :name, :description
    has_many :animals
  end
  &lt;/pre&gt;

  &lt;p&gt;Scaffold taraf&amp;#305;ndan olu&amp;#351;turulan form a&amp;#351;a&amp;#287;&amp;#305;da g&amp;#246;steriliyor. Bunu biraz Formtastic koduyla de&amp;#287;i&amp;#351;tirmek istiyoruz.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/218/original/E184I05.png" alt="Varsay&amp;#305;lan Yeni Hayvan sayfas&amp;#305;." height="488" width="800"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Kategori formunda yapt&amp;#305;&amp;#287;&amp;#305;m&amp;#305;z gibi varsay&amp;#305;lan &lt;code&gt;form_for&lt;/code&gt; kodunu bir Formtastic &lt;code&gt;semantic_form_for&lt;/code&gt; formuyla de&amp;#287;i&amp;#351;tirece&amp;#287;iz.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;% semantic_form_for @animal do |f| %&amp;gt;
    &amp;lt;% f.inputs do %&amp;gt;
      &amp;lt;%= f.input :name %&amp;gt;
      &amp;lt;%= f.input :born_on %&amp;gt;
      &amp;lt;%= f.input :category %&amp;gt;
      &amp;lt;%= f.input :female %&amp;gt;
    &amp;lt;% end %&amp;gt;
    &amp;lt;%= f.buttons %&amp;gt;
  &amp;lt;% end %&amp;gt;
  &lt;/pre&gt;

  &lt;p&gt;Az sonra form alanlar&amp;#305;m&amp;#305;z&amp;#305; &amp;#246;zelle&amp;#351;tirece&amp;#287;imiz i&amp;#231;in bu defa onlar&amp;#305;n &amp;#252;zerinde biraz daha fazla kontrol&amp;#252;m&amp;#252;z&amp;#252;n olmas&amp;#305;n&amp;#305; istiyoruz. Bu nedenle &lt;code&gt;f.inputs&lt;/code&gt; metoduna, alanlar&amp;#305; birer birer tan&amp;#305;mlamak i&amp;#231;in &lt;code&gt;input&lt;/code&gt; metodunu kulland&amp;#305;&amp;#287;&amp;#305;m&amp;#305;z bir blok parametresi verdik. Blo&amp;#287;u kapatt&amp;#305;ktan sonra &amp;#246;nceden yapt&amp;#305;&amp;#287;&amp;#305;m&amp;#305;z gibi &lt;code&gt;f.buttons&lt;/code&gt; metodunu kullanarak g&amp;#246;nder d&amp;#252;&amp;#287;mesini ekleyebiliriz.&lt;/p&gt;

  &lt;p&gt;Formu &amp;#351;imdi yeniden y&amp;#252;klersek Formtastic taraf&amp;#305;ndan olu&amp;#351;turulan alanlar&amp;#305; g&amp;#246;r&amp;#252;r&amp;#252;z.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/219/original/E184I06.png" alt="Formtastic kontrolleri i&amp;#231;eren Yeni Hayvan sayfas&amp;#305;." height="477" width="801"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Formtastic, &lt;code&gt;Animal&lt;/code&gt; model&amp;rsquo;inin &amp;#246;zelliklerinin veri t&amp;#252;rlerine ba&amp;#287;l&amp;#305; olarak uygun form alanlar&amp;#305;n&amp;#305; olu&amp;#351;turdu. Burada g&amp;#246;remiyor olsan&amp;#305;z da, &lt;code&gt;category_id&lt;/code&gt; alan&amp;#305;n&amp;#305;n bir ili&amp;#351;ki oldu&amp;#287;unu anlay&amp;#305;p kategori a&amp;#231;&amp;#305;l&amp;#305;r kutusunu &amp;#246;nceden ekledi&amp;#287;imiz iki kategoriyle doldurdu bile.&lt;/p&gt;

  &lt;p&gt;Bu formda yapmak istedi&amp;#287;imiz birka&amp;#231; de&amp;#287;i&amp;#351;iklik var. Varsay&amp;#305;lan olarak, tarih alan&amp;#305;n&amp;#305;n y&amp;#305;l k&amp;#305;sm&amp;#305; &amp;#351;u anki y&amp;#305;l&amp;#305;n 5 y&amp;#305;l &amp;#246;ncesiyle 5 y&amp;#305;l sonras&amp;#305;n&amp;#305;n aras&amp;#305;ndakileri i&amp;#231;eriyor. Bizimse bundan daha &amp;#246;nceki y&amp;#305;llar&amp;#305; g&amp;#246;stermemiz gerekiyor. Ayr&amp;#305;ca, &lt;code&gt;category&lt;/code&gt; a&amp;#231;&amp;#305;l&amp;#305;r kutusundan bo&amp;#351; se&amp;#231;ene&amp;#287;i kald&amp;#305;rmak ve &lt;code&gt;female&lt;/code&gt; alan&amp;#305;n&amp;#305; bir onay kutusu yerine bir &amp;#231;ift radyo d&amp;#252;&amp;#287;mesi olarak g&amp;#246;stermek istiyoruz.&lt;/p&gt;

  &lt;p&gt;Rails&amp;rsquo;in form yard&amp;#305;mc&amp;#305; metodlar&amp;#305;na verdi&amp;#287;imiz se&amp;#231;eneklerin ayn&amp;#305;lar&amp;#305;n&amp;#305; kullanarak alanlar&amp;#305; &amp;#246;zelle&amp;#351;tirebiliriz. Yani, &lt;code&gt;born_on&lt;/code&gt; alan&amp;#305;na &lt;code&gt;:start_year&lt;/code&gt; parametresi verebilir ve kategorimizdeki bo&amp;#351; se&amp;#231;ene&amp;#287;i kald&amp;#305;rmak i&amp;#231;in&lt;code&gt;:include_blank =&amp;gt; false&lt;/code&gt; parametresini kullanabiliriz.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;% semantic_form_for @animal do |f| %&amp;gt;
    &amp;lt;% f.inputs do %&amp;gt;
      &amp;lt;%= f.input :name %&amp;gt;
      &amp;lt;%= f.input :born_on, :start_year =&amp;gt; 1900 %&amp;gt;
      &amp;lt;%= f.input :category, :include_blank =&amp;gt; false %&amp;gt;
      &amp;lt;%= f.input :female, :as =&amp;gt; :radio %&amp;gt;
    &amp;lt;% end %&amp;gt;
    &amp;lt;%= f.buttons %&amp;gt;
  &amp;lt;% end %&amp;gt;
  &lt;/pre&gt;

  &lt;p&gt; &lt;code&gt;female&lt;/code&gt;
form &amp;#246;&amp;#287;esinin t&amp;#252;r&amp;#252;n&amp;#252; de&amp;#287;i&amp;#351;tirece&amp;#287;imiz i&amp;#231;in, bu alana biraz farkl&amp;#305;
davranmam&amp;#305;z gerekiyor. Varsay&amp;#305;landan farkl&amp;#305; bir alan t&amp;#252;r&amp;#252; belirtmek
i&amp;#231;in, Formtastic&amp;rsquo;in bir
&lt;code&gt;:as&lt;/code&gt; parametresi bulunuyor. T&amp;#252;r&amp;#252; radyo d&amp;#252;&amp;#287;mesine &amp;#231;evirmek i&amp;#231;in &lt;code&gt;:as =&amp;gt; :radio&lt;/code&gt; parametresini kullanabiliriz.&lt;/p&gt;

  &lt;p&gt;Forma &amp;#351;imdi yeniden g&amp;#246;z atarsak, yapt&amp;#305;&amp;#287;&amp;#305;m&amp;#305;z de&amp;#287;i&amp;#351;ikliklerin yans&amp;#305;t&amp;#305;ld&amp;#305;&amp;#287;&amp;#305;n&amp;#305;; tarihlerin 1900&amp;rsquo;den ba&amp;#351;lad&amp;#305;&amp;#287;&amp;#305;n&amp;#305;, kategoriden bo&amp;#351; se&amp;#231;ene&amp;#287;in kald&amp;#305;r&amp;#305;ld&amp;#305;&amp;#287;&amp;#305;n&amp;#305; ve cinsiyet onay kutusunun iki radyo d&amp;#252;&amp;#287;mesiyle de&amp;#287;i&amp;#351;tirildi&amp;#287;ini g&amp;#246;rece&amp;#287;iz.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/220/original/E184I07.png" alt="Cinsiyet alan&amp;#305; art&amp;#305;k radyo d&amp;#252;&amp;#287;meleriyle g&amp;#246;steriliyor." height="477" width="801"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Radyo
d&amp;#252;&amp;#287;meleri onay kutusuna g&amp;#246;re daha iyi oldu, ancak &amp;ldquo;yes&amp;rdquo; (evet) ve &amp;ldquo;no&amp;rdquo;
(hay&amp;#305;r) yazmas&amp;#305; yerine, alan&amp;#305;n etiketinin &amp;ldquo;Gender&amp;rdquo; (Cinsiyet) olmas&amp;#305;n&amp;#305;
ve radyo d&amp;#252;&amp;#287;melerinin &amp;ldquo;Male&amp;rdquo; (Erkek) ve &amp;ldquo;Female&amp;rdquo; (Di&amp;#351;i) olarak
etiketlendirilmesini istiyoruz. Formtastic bu derecede bir
&amp;#246;zelle&amp;#351;tirmeye izin veriyor mu? Evet, izin veriyor. Etiketin ve radyo
d&amp;#252;&amp;#287;melerinin de&amp;#287;erlerini belirlemek i&amp;#231;in &lt;code&gt;:label&lt;/code&gt; (etiket) ve &lt;code&gt;:collection&lt;/code&gt; (koleksiyon) se&amp;#231;eneklerini kullanabiliriz.&lt;/p&gt;
  &lt;pre class="ruby"&gt;
  &amp;lt;%= f.input :female, :as =&amp;gt; :radio, :label =&amp;gt; &amp;quot;Gender&amp;quot;, :collection =&amp;gt; [[&amp;quot;Male&amp;quot;, false], [&amp;quot;Female&amp;quot;, true]] %&amp;gt;
  &lt;/pre&gt;
  &lt;p&gt;Ad&amp;#305;ndan anla&amp;#351;&amp;#305;laca&amp;#287;&amp;#305; gibi, &lt;code&gt;:label&lt;/code&gt; se&amp;#231;ene&amp;#287;i etiketin ad&amp;#305;n&amp;#305; belirlerken, &lt;code&gt;:collection&lt;/code&gt; se&amp;#231;ene&amp;#287;i her bir radyo d&amp;#252;&amp;#287;mesinin ad&amp;#305;n&amp;#305; ve de&amp;#287;erini belirten, dizilerden olu&amp;#351;an bir diziyi parametre olarak al&amp;#305;r.&lt;/p&gt;

  &lt;p&gt;Form art&amp;#305;k tam istedi&amp;#287;imiz gibi g&amp;#246;r&amp;#252;n&amp;#252;yor.&lt;/p&gt;

  &lt;div class="imageWrapper"&gt;
    &lt;img src="/system/photos/221/original/E184I08.png" alt="Radyo d&amp;#252;&amp;#287;mesinin &amp;#252;zerindeki etiketlerde bizim istedi&amp;#287;imiz metin g&amp;#246;r&amp;#252;n&amp;#252;yor." height="477" width="801"/&gt;
  &lt;/div&gt;

  &lt;p&gt;Formumuz art&amp;#305;k tamamland&amp;#305; ve istedi&amp;#287;imiz kadar yeni hayvan olu&amp;#351;turmak i&amp;#231;in onu kullanabiliriz.&lt;/p&gt;

  &lt;h3&gt;Sonraki Ad&amp;#305;mlar&lt;/h3&gt;

  &lt;p&gt;Formtastic&amp;rsquo;le birlikte nispeten daha az view koduyla
olduk&amp;#231;a karma&amp;#351;&amp;#305;k bir formu ba&amp;#351;ar&amp;#305;yla olu&amp;#351;turduk, &amp;#246;zelle&amp;#351;tirme
se&amp;#231;eneklerini kullanarak baz&amp;#305; alanlar&amp;#305; ihtiyac&amp;#305;m&amp;#305;za g&amp;#246;re de&amp;#287;i&amp;#351;tirdik.
Yine de hala i&amp;#351;lemedi&amp;#287;imiz Formtastic &amp;#246;zellikleri oldu&amp;#287;undan, bir
sonraki b&amp;#246;l&amp;#252;mde daha ayr&amp;#305;nt&amp;#305;ya girece&amp;#287;iz.&lt;/p&gt;</description>
      <pubDate>Mon, 30 Nov 2009 21:31:19 +0000</pubDate>
      <guid>http://tr.asciicasts.com/episodes/184-formtastic-bolum-1</guid>
      <link>http://tr.asciicasts.com/episodes/184-formtastic-bolum-1</link>
    </item>
  </channel>
</rss>

