{"id":34,"date":"2013-05-05T12:04:15","date_gmt":"2013-05-05T12:04:15","guid":{"rendered":"http:\/\/mobiehl.de\/wordpress\/pc-knowhow\/?p=34"},"modified":"2013-05-05T12:04:15","modified_gmt":"2013-05-05T12:04:15","slug":"ruby-on-rails","status":"publish","type":"post","link":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/2013\/05\/05\/ruby-on-rails\/","title":{"rendered":"Ruby on Rails"},"content":{"rendered":"<p><b>Inhalt<\/b><\/p>\n<ol>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Tutorials%20und%20Referenzen\">Tutorials und Referenzen<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Tools%20and%20Environment\">Tools and Environment<\/a>\n<ol>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#But%20What%20Does%20It%20All%20Mean\">But What Does It All Mean<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Testtools\">Testtools<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#GIT%20-%20Version%20controll\">GIT &#8211; Version controll<\/a><\/li>\n<\/ol>\n<\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Entwicklungszyklus\">Entwicklungszyklus<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Themen%20und%20Komponenten\">Themen und Komponenten<\/a>\n<ol>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#rake\">Rake<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#annotate_models\">Plugin annotate models<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Controller\">Controller &#8211; Action &#8211; Parameter<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#ORM\">ORM &#8211; Objekt relational mapping<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Ruby\">Ruby<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Validation%20von%20Modelparametern\">Validation von Modelparametern<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Associating%20Models\">Associating models<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Rails-Helper\">Rails Helper<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Fileupload\">Fileupload<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#AJAX\">Ajax<\/a><\/li>\n<\/ol>\n<\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Facebooker\">Facebooker<\/a><\/li>\n<li><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#Spickzettel\">Spickzettel<\/a><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2><a title=\"Tutorials und Referenzen\" name=\"Tutorials und Referenzen\"><\/a>1. Tutorials und Referenzen<\/h2>\n<p><a href=\"http:\/\/www.railstutorial.org\/\" target=\"_blank\">Ruby on Rails Tutorial<\/a><br \/>\n<a href=\"http:\/\/www.railstutorial.org\/chapters\/beginning#top\" target=\"_blank\">&#8211;\u00a0Chapter 1\u00a0From zero to deploy<\/a><br \/>\n<a href=\"http:\/\/www.railstutorial.org\/chapters\/rails-flavored-ruby#top\" target=\"_blank\">&#8211; Chapter 3\u00a0Rails-flavored Ruby<\/a><br \/>\n&nbsp;<\/p>\n<p><a href=\"http:\/\/guides.rubyonrails.org\/\">Ruby on Rails Guide<\/a><\/p>\n<p><a href=\"http:\/\/api.rubyonrails.org\/\" target=\"_blank\">Rail API<\/a><\/p>\n<p><a href=\"http:\/\/www.ruby-lang.org\/de\/documentation\/\">Ruby Einf\u00fchrung und Dokumentation<\/a><\/p>\n<p><a href=\"http:\/\/www.rubyist.net\/~slagell\/ruby\/backtoexamples.html\" target=\"_blank\">Ruby-page<\/a><\/p>\n<p><a href=\"http:\/\/www.ruby-doc.org\/core\/\">Ruby-Core<\/a><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/openbook.galileocomputing.de\/ruby_on_rails\/ruby_on_rails_04_008.htm\" target=\"_blank\">galileo openbook: ruby_on_rails08<\/a><\/p>\n<h3 id=\"post-66\"><\/h3>\n<p><a title=\"Permanent Link: Starting Ruby on Rails: What I Wish I Knew\" href=\"http:\/\/betterexplained.com\/articles\/starting-ruby-on-rails-what-i-wish-i-knew\/\" rel=\"bookmark\">Starting Ruby on Rails: What I Wish I Knew<\/a><\/p>\n<p>Rails-sourcen:\u00a0<a href=\"http:\/\/rubyforge.org\/frs\/?group_id=307\">http:\/\/rubyforge.org\/frs\/?group_id=307<\/a><br \/>\n<a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h2><a title=\"Tools and Environment\" name=\"Tools and Environment\"><\/a>2. Tools and Environment<\/h2>\n<p>Here\u2019s the tools you\u2019ll need. Don\u2019t read endless reviews trying to decide on the best one; start somewhere and get going.<\/p>\n<ul>\n<li><a href=\"http:\/\/www.pragmaticprogrammer.com\/titles\/rails\/\">Agile Web Development with Rails<\/a>. Yes, it\u2019s a book. And a cohesive book is worth 100 hobbled-together\u00a0<a href=\"http:\/\/wiki.rubyonrails.com\/rails\">online tutorials<\/a>.<\/li>\n<li><a href=\"http:\/\/rubyforge.org\/projects\/instantrails\/\">InstantRails<\/a>: A .zip file containing Ruby, Apache, MySQL and\u00a0PHP\u00a0(for PhpMyAdmin), packaged and ready to go.<\/li>\n<li><a href=\"http:\/\/www.aptana.com\/\">Aptana\/RadRails<\/a>\u00a0(like Eclipse) or\u00a0<a href=\"http:\/\/www.sapphiresteel.com\/\">Ruby In Steel<\/a>\u00a0(like Visual Studio) for editing code.<\/li>\n<li><a href=\"http:\/\/www.railstutorial.org\/chapters\/beginning#sec:version_control\" target=\"_blank\">GIT &#8211; Version control<\/a><\/li>\n<li><a title=\"command-line\" href=\"http:\/\/subversion.tigris.org\/\">Subversion<\/a>\u00a0and\/or\u00a0<a title=\"Windows GUI\" href=\"http:\/\/tortoisesvn.net\/downloads\">TortoiseSVN<\/a>\u00a0for source control.<\/li>\n<li>Browse popular ruby on rails links on\u00a0<a href=\"http:\/\/del.icio.us\/popular\/rubyonrails\">del.icio.us<\/a>,\u00a0<a href=\"http:\/\/railsbrain.com\/\">Rails documentation<\/a>\u00a0and\u00a0<a href=\"http:\/\/docs.huihoo.com\/ruby\/ruby-man-1.4\/syntax.html\">Ruby syntax &amp; examples<\/a>.<\/li>\n<\/ul>\n<h3><a title=\"But What Does It All Mean\" name=\"But What Does It All Mean\"><\/a>2.1 But What Does It All Mean?<\/h3>\n<p><b>Ruby<\/b>\u00a0is a programming language, similar to Python and Perl. It is dynamically typed (no need for \u201cint i\u201d), interpreted, and can be modified at runtime (such as adding new methods to classes).<br \/>\n<a href=\"http:\/\/www.ruby-doc.org\/core\/\">Ruby API<\/a><\/p>\n<p><b>Rails<\/b>\u00a0is a\u00a0<a href=\"http:\/\/rubygems.org\/read\/book\/1\">gem<\/a>, or a Ruby library.<br \/>\n<a href=\"http:\/\/api.rubyonrails.org\/\">Rails API<\/a><\/p>\n<p><b>IRB<\/b>\u00a0is the interactive Ruby console (type \u201cirb\u201d to use). Rails has a special\u00a0IRB\u00a0console to access your web app as it is running (excellent for live debugging): apps\/blog&gt;<b><i>ruby script\/console<\/i><\/b><\/p>\n<p><b>Rake<\/b>\u00a0is Ruby\u2019s version of Make. Define and run maintenance tasks like setting up databases, reloading data, backing up, or even deploying an app to your website.<\/p>\n<p><b>Erb<\/b>\u00a0is embedded Ruby, which is like\u00a0PHP.\u00a0It lets you mix Ruby with\u00a0HTML\u00a0(for example):<\/p>\n<pre><\/pre>\n<div>\n<pre>Hello there, &lt;%= get_user_name() %&gt;<\/pre>\n<\/div>\n<p><b>YAML\u00a0(or\u00a0YML)<\/b>\u00a0means \u201cYAML Ain\u2019t a Markup Language\u201d \u2014 it\u2019s a simple way to\u00a0<a href=\"http:\/\/en.wikipedia.org\/wiki\/YAML\">specify data<\/a>:<\/p>\n<pre><code>{name: John Smith, age: 33}<\/code><\/pre>\n<p>It\u2019s like\u00a0JSON<\/p>\n<p><b>Eclipse<\/b><a href=\"http:\/\/wiki.rubyonrails.org\/rails\/pages\/HowtoUploadFiles\" target=\"_blank\"><br \/>\n<\/a><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.oreillynet.com\/pub\/a\/ruby\/2007\/04\/26\/ruby-on-rails-meets-eclipse.html?page=1\" target=\"_blank\">O&#8217;Reilly: Ruby on Rails Meets Eclipse (2007)<\/a><\/p>\n<h3><a title=\"Testtools\" name=\"Testtools\"><\/a>2.2 Testtools<\/h3>\n<p><b>irb &#8211; interactive ruby bash<\/b><\/p>\n<p>rubyf\u00e4higen Terminal \u00f6ffnen (z.B. per Locomotive)<\/p>\n<p>apps\/blog&gt;<b><i>irb<\/i><\/b><\/p>\n<p>Befehle zeilenweise eingeben:<\/p>\n<p>irb(main):012:0&gt; tmp = [[1,2],[3,4]]<br \/>\n=&gt; [[1, 2], [3, 4]]<br \/>\nirb(main):007:0&gt; for i in tmp<br \/>\nirb(main):008:1&gt; i[0] = 11<br \/>\nirb(main):009:1&gt; end<br \/>\n=&gt; [[11, 2], [11, 4]]<\/p>\n<p><b>Ruby Console<\/b><\/p>\n<p>irb f\u00fcr das aktuelle Projekt: Rails invokes Ruby\u2019s irb utility in the context of your Rails application<\/p>\n<p>rubyf\u00e4higen Terminal in Projekt \u00f6ffnen (z.B. per Locomotive)<\/p>\n<p>apps\/blog&gt;<b><i>ruby script\/console<\/i><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>Loading development environment (Rails 2.1.1)<br \/>\n&gt;&gt;<\/p>\n<p>Jetzt Rubybefehle zeilenweise<\/p>\n<h3><a title=\"GIT - Version controll\" name=\"GIT - Version controll\"><\/a>2.3 GIT &#8211; Version controll<\/h3>\n<p>siehe\u00a0<a href=\"http:\/\/www.mobiehl.de\/index.php\/pc\/git\">GIT<\/a><\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h2><a title=\"Entwicklungszyklus\" name=\"Entwicklungszyklus\"><\/a>3. Entwicklungszyklus<\/h2>\n<ul>\n<li>apps&gt;<b><i>rails blog -d mysql<\/i><\/b>\n<ul>\n<li>erzeugt neue Anwendung &#8220;blog&#8221;<\/li>\n<\/ul>\n<\/li>\n<li>apps\/blog&gt;<b><i>rake db:create<\/i><\/b>\n<ul>\n<li>erzeugt die passende Datenbank &#8220;blog_development&#8221;<\/li>\n<\/ul>\n<\/li>\n<li>apps\/blog&gt;<b><i>script\/generate controller home index<\/i><\/b>\n<ul>\n<li>erzeugt den controller home mit der action index<\/li>\n<\/ul>\n<ul>\n<li><span style=\"color: #008000\">Anwendung kann jetzt getestet werden &#8211; Standartstartseite<\/span><\/li>\n<\/ul>\n<\/li>\n<li>apps\/blog&gt;<i><b>rm public\/index.html<\/b><\/i>\n<ul>\n<li>in\u00a0<i><b>config\/routes\u00a0<\/b><\/i>folgendes vor map.connect erg\u00e4nzen<br \/>\n<i><b>map.root :controller =&gt; &#8220;home&#8221;<\/b><\/i><\/li>\n<li><span style=\"color: #008000\">Anwendung kann jetzt getestet werden &#8211; Startseite = home\/index<\/span><\/li>\n<\/ul>\n<\/li>\n<li>apps\/blog&gt;<i><b>script\/generate scaffold Post name:string title:string content:text<\/b><\/i>\n<ul>\n<li>erzeugt MVC-Standartfiles f\u00fcr Manipulation von Model Post<\/li>\n<\/ul>\n<\/li>\n<li>apps\/blog&gt;<i><b>rake db:migrate<\/b><\/i>\n<ul>\n<li>erzeugt alle Tabellen aus den Models, bzw. aus den migrationfiles<\/li>\n<\/ul>\n<\/li>\n<li>Link erg\u00e4nzen: apps\/blog\/app\/views\/home\/index.html.erb editieren\n<ul>\n<li><code>&lt;%= link_to \"My Blog\", posts_path %&gt;<\/code><\/li>\n<li><span style=\"color: #008000\">Anwendung kann jetzt getestet werden &#8211; Startseite = home\/index &#8211; dem Link folgen<\/span><\/li>\n<\/ul>\n<\/li>\n<li>apps\/blog&gt;<i><b>rake doc:app<\/b><\/i>\n<ul>\n<li>Erzeugt Documentation unter doc\/app\/<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>Controller und Models einzeln hinzuf\u00fcgen\n<ul>\n<li>apps\/blog&gt;<i><b>ruby script\/generate [controller|model|migration] yourname<\/b><\/i><\/li>\n<\/ul>\n<\/li>\n<li>Migration editieren:<i><b>\u00a0<\/b><\/i><br \/>\nblog\/db\/migrate\/20090321142337_create_channels.rb<\/li>\n<li>apps\/blog&gt;<i><b>rake db:migrate<\/b><\/i><\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h2><a title=\"Themen und Komponenten\" name=\"Themen und Komponenten\"><\/a>4. Themen und Komponenten<\/h2>\n<h3><a title=\"rake\" name=\"rake\"><\/a><b>4.1 rake<\/b><\/h3>\n<p><b>DB Migration<\/b><\/p>\n<p>&gt;rake db:migrate<\/p>\n<p>&gt;rake db:migrate VERSION=10<\/p>\n<p>&gt; ruby script\/generate scaffold<\/p>\n<p><b>Freezing Rails<\/b><\/p>\n<p>Speichert alle verwendeten gems in vendor\/rails und nutzt diese statt des Lokalen Rails<\/p>\n<pre>&gt;rake rails:freeze:gems<\/pre>\n<pre>&gt;rake rails:unfreeze<\/pre>\n<p><a href=\"http:\/\/support.tigertech.net\/freeze-rails\" target=\"_blank\">Weitere Infos<\/a><\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h3><a title=\"annotate_models\" name=\"annotate_models\"><\/a><b>4.2 Plugin annotate_models<\/b><\/h3>\n<p>1.download+install (for each project):<br \/>\nplanner&gt;<i>ruby script\/plugin install http:\/\/repo.pragprog.com\/svn\/Public\/plugins\/annotate_models<\/i><\/p>\n<p>2.run:<br \/>\nplanner&gt;<i>rake annotate_models<\/i><\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h3><a title=\"Controller\" name=\"Controller\"><\/a><b>4.3 Controller &#8211; Action &#8211; Parameter<\/b><\/h3>\n<p><i><b>http:\/\/my.url\/store\/add_to_cart\/123<\/b><\/i><br \/>\nIn this simple case, it takes the first part of the path, store, as the<br \/>\nname of the controller and the second part, add_to_cart, as the name of an<br \/>\naction. The last part of the path, 123, is by convention extracted into an internal<br \/>\nparameter called id.<\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h3><a title=\"ORM\" name=\"ORM\"><\/a><b>4.4 ORM-object relational mapping<\/b><\/h3>\n<p>So an ORM layer maps tables to classes, rows to objects, and columns to<br \/>\nattributes of those objects. Class methods are used to perform table-level operations,<br \/>\nand instance methods perform operations on the individual rows.<\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h3><a title=\"Ruby\" name=\"Ruby\"><\/a><b>4.5 Ruby<\/b><\/h3>\n<p><b>Types of variables<\/b><br \/>\nname local variable \u2018name\u2019<br \/>\n@name instance variable \u2018name\u2019<br \/>\n:name Symbol \u2018name\u2019<\/p>\n<p>Instance variables are\u00a0<code>nil<\/code>\u00a0if not defined, while local var not defined leads to an error.<br \/>\n<b>Ruby symbol<\/b><br \/>\nlink_to &#8220;Goodbye!&#8221; , :action =&gt; &#8220;goodbye&#8221;<br \/>\nThe :action part is a Ruby symbol. You can think of the colon as meaning<br \/>\nthe thing named&#8230;, so :action means the thing named action.7 The =&gt; &#8220;goodbye&#8221;<br \/>\nassociates the string goodbye with the name action. In effect, this gives us<br \/>\nkeyword parameters for methods.<\/p>\n<p><b>Arrays<\/b><\/p>\n<p>a\u00a0=\u00a0[42,\u00a08,\u00a017]<\/p>\n<p>a\u00a0&lt;&lt;\u00a0&#8220;foo&#8221;\u00a0&lt;&lt;\u00a0&#8220;bar&#8221;\u00a0# Chaining array pushes<br \/>\n=&gt; [42, 8, 17, 7, &#8220;foo&#8221;, &#8220;bar&#8221;]<\/p>\n<p>&gt;&gt;\u00a0(0..9).to_a\u00a0# Use parentheses to call to_a on the range<\/p>\n<p>=&gt; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]<\/p>\n<p>&gt;&gt;\u00a0a.sort_by\u00a0{\u00a0rand\u00a0}<\/p>\n<p>array = array.split(\/,\\s*\/)<\/p>\n<p>array2 = []<\/p>\n<p>array.in_groups_of(6) {|item| array2 &lt;&lt; item }<\/p>\n<p>puts array2[2][0]<\/p>\n<p><b>Hashes<\/b><\/p>\n<pre>&gt;&gt; user = {}                          # {} is an empty hash\r\n=&gt; {}\r\n&gt;&gt; user[\"first_name\"] = \"Michael\"     # Key \"first_name\", value \"Michael\"\r\n=&gt; \"Michael\"\r\n&gt;&gt; user[\"last_name\"] = \"Hartl\"        # Key \"last_name\", value \"Hartl\"\r\n=&gt; \"Hartl\"\r\n&gt;&gt; user[\"first_name\"]                 # Element access is like arrays\r\n=&gt; \"Michael\"\r\n&gt;&gt; user                               # A literal representation of the hash\r\n=&gt; {\"last_name\"=&gt;\"Hartl\", \"first_name\"=&gt;\"Michael\"}\r\n&gt;&gt; user = { \"first_name\" =&gt; \"Michael\", \"last_name\" =&gt; \"Hartl\" }<\/pre>\n<p>better use symbols<\/p>\n<pre>&gt;&gt; user = { :name =&gt; \"Michael Hartl\", :email =&gt; \"\r\n <a href=\"mailto:michael@example.com\">michael@example.com<\/a>\" }\r\n=&gt; {:name=&gt;\"Michael Hartl\", :email=&gt;\"\r\n <a href=\"mailto:michael@example.com\">michael@example.com<\/a>\"}\r\n&gt;&gt; user[:name]              # Access the value corresponding to :name.\r\n=&gt; \"Michael Hartl\"\r\n&gt;&gt; user[:password]          # Access the value of an undefined key.\r\n=&gt; nil<\/pre>\n<p>Multidim hashes<\/p>\n<pre>&gt;&gt; params = {}        # We'll start with the strategically named params hash.\r\n=&gt; {}\r\n&gt;&gt; params[:user] = { :name =&gt; \"Michael Hartl\", :email =&gt; \"\r\n <a href=\"mailto:mhartl@example.com\">mhartl@example.com<\/a>\" }\r\n=&gt; {:name=&gt;\"Michael Hartl\", :email=&gt;\"\r\n <a href=\"mailto:mhartl@example.com\">mhartl@example.com<\/a>\"}\r\n&gt;&gt; params\r\n=&gt; {:user=&gt;{:name=&gt;\"Michael Hartl\", :email=&gt;\"\r\n <a href=\"mailto:mhartl@example.com\">mhartl@example.com<\/a>\"}}\r\n&gt;&gt;  params[:user][:email]\r\n=&gt; \"\r\n <a href=\"mailto:mhartl@example.com\">mhartl@example.com<\/a>\"<\/pre>\n<p>&nbsp;<\/p>\n<p><b>Generelle Regeln<\/b><\/p>\n<p>&#8211; Ruby functions have an\u00a0<i>implicit return<\/i>, meaning they return the last statement evaluated<\/p>\n<p>&#8211; Ruby also has an explicit return option; using first return if if-statement is true:<\/p>\n<div>\n<div>\n<pre>&gt;&gt; def string_message(string)\r\n&gt;&gt;   return \"It's an empty string!\" if string.empty?\r\n&gt;&gt;   return \"The string is nonempty.\"\r\n&gt;&gt; end<\/pre>\n<div>\n<div>\n<p>Auch explizit und implizit m\u00f6glich:<\/p>\n<pre>&gt;&gt; def string_message(string)\r\n&gt;&gt;   return \"It's an empty string!\" if string.empty?\r\n&gt;&gt;   \"The string is nonempty.\"\r\n&gt;&gt; end<\/pre>\n<p>Parameter for functions<\/p>\n<pre># Parentheses on function calls are optional.\r\nstylesheet_link_tag('blueprint\/screen', :media =&gt; 'screen')\r\nstylesheet_link_tag 'blueprint\/screen', :media =&gt; 'screen'<\/pre>\n<pre># Curly braces on final hash arguments are optional.\r\nstylesheet_link_tag 'blueprint\/screen', { :media =&gt; 'screen' }\r\nstylesheet_link_tag 'blueprint\/screen', :media =&gt; 'screen'<\/pre>\n<p><b>Klassen, Funktionen und Methoden<\/b><\/p>\n<p>Methods: Functions provided by an instance variable<\/p>\n<pre>&gt;&gt; class Word\r\n&gt;&gt;   def palindrome?(string)\r\n&gt;&gt;     string == string.reverse\r\n&gt;&gt;   end\r\n&gt;&gt; end\r\n\r\n&gt;&gt; w = Word.new              # Make a new Word object\r\n&gt;&gt; w.palindrome?(\"level\")\r\n=&gt; true<\/pre>\n<p>Using Inheritance<\/p>\n<p>Here\u00a0<code>Word &lt; String<\/code>\u00a0is the Ruby syntax for inheritance, which ensures that, in addition to the new\u00a0<code>palindrome?<\/code>\u00a0method, words also have all the same methods as strings<\/p>\n<pre>&gt;&gt; class Word &lt; String             # Word inherits from String\r\n&gt;&gt;   # Return true if the string is its own reverse.\r\n&gt;&gt;   def palindrome?\r\n&gt;&gt;     self == self.reverse             # self is the string itself\r\n&gt;&gt;   end\r\n&gt;&gt; end\r\n\r\n&gt;&gt; s = Word.new(\"level\")    # Make a new Word, initialized with \"level\".\r\n=&gt; \"level\"                  \r\n&gt;&gt; s.palindrome?            # Words have the palindrome? method.\r\n=&gt; true                     \r\n&gt;&gt; s.length                 # Words also inherit all the normal string methods.\r\n=&gt; 5<\/pre>\n<p>Klassen \u00fcberschreiben<\/p>\n<pre>&gt;&gt; class String\r\n&gt;&gt;   # Return true if the string is its own reverse.\r\n&gt;&gt;   def palindrome?\r\n&gt;&gt;     self == self.reverse\r\n&gt;&gt;   end\r\n&gt;&gt; end\r\n=&gt; nil\r\n&gt;&gt; \"deified\".palindrome?\r\n=&gt; true<\/pre>\n<p>&nbsp;<\/p>\n<p><b>Modules<\/b><\/p>\n<\/div>\n<\/div>\n<p>&#8211; module ApplicationHelper: code in Ruby modules can be mixed in to Ruby classes. When writing ordinary Ruby, you often write modules and include them explicitly yourself, but in this case Rails handles the inclusion automatically for us.<\/p>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h3><a title=\"Validation von Modelparametern\" name=\"Validation von Modelparametern\"><\/a>4.6 Validation von Modelparametern<\/h3>\n<div><code>class\u00a0Post &lt; ActiveRecord::Base<br \/>\nvalidates_presence_of\u00a0:name,\u00a0:title<br \/>\nvalidates_length_of\u00a0:title,\u00a0:minimum\u00a0=&gt; 5<\/code><\/div>\n<div>&#8230;<\/div>\n<div><code>end<\/code><\/div>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h3><a title=\"Associating Models\" name=\"Associating Models\"><\/a>4..7 Associating Models<\/h3>\n<p><b>1:n<\/b><\/p>\n<p>class Product &lt; ActiveRecord::Base<br \/>\nhas_many :line_items<br \/>\nend<br \/>\nclass LineItem &lt; ActiveRecord::Base<br \/>\nbelongs_to :product<br \/>\nend<br \/>\n<b>1:1<\/b><\/p>\n<p>class Order &lt; ActiveRecord::Base<br \/>\nhas_one :invoice<br \/>\nend<\/p>\n<p><b>n:m<\/b><\/p>\n<p>class Article &lt; ActiveRecord::Base<br \/>\nhas_and_belongs_to_many :users<br \/>\n# &#8230;<br \/>\nend<\/p>\n<p>class User &lt; ActiveRecord::Base<br \/>\nhas_and_belongs_to_many :articles<br \/>\n# &#8230;<br \/>\nend<\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h3><a title=\"Rails-Helper\" name=\"Rails-Helper\"><\/a>4.8 Rails-Helper<\/h3>\n<p>(see all at\u00a0<a href=\"http:\/\/api.rubyonrails.org\/\">Rails Framework Doc<\/a>)<br \/>\nA\u00a0<i>helper<\/i>\u00a0is a function designed for use in views.<\/p>\n<p>&lt;% for item in @items %&gt;<br \/>\n&lt;% for column in Item.content_columns %&gt;<br \/>\n&lt;%=h item.send(column.name) %&gt;<br \/>\n&lt;% end %&gt;<br \/>\n&lt;%= link_to &#8216;Show&#8217;, :action =&gt; &#8216;show&#8217;, :id =&gt; item %&gt;<br \/>\n&lt;%= link_to &#8216;Edit&#8217;, :action =&gt; &#8216;edit&#8217;, :id =&gt; item %&gt;<br \/>\n&lt;%= link_to &#8216;Destroy&#8217;, { :action =&gt; &#8216;destroy&#8217;, :id =&gt; item }, :confirm =&gt; &#8216;Are you sure?&#8217;, :method =&gt; :post %&gt;<br \/>\n&lt;% end %&gt;<\/p>\n<p>&lt;%= link_to image_tag(&#8216;delete.png&#8217;), { :action =&gt; &#8216;destroy&#8217;, :id =&gt; @entry, :start =&gt; @root, :layout =&gt; @layout }, :confirm =&gt; &#8216;Are you sure?&#8217;, :method =&gt; :post %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%= link_to image_tag(&#8216;Einstellungen.gif&#8217;, :width =&gt; 50, :border =&gt; 0), :controller =&gt; &#8216;settings&#8217;, :action =&gt; &#8216;list&#8217; %&gt;<\/p>\n<p><img alt=\"\" src=\"https:\/\/www.mobiehl.de\/images\/%3C%=%20item.item_img%20%%3E\" border=\"0\" \/><\/p>\n<p>&lt;%= stylesheet_link_tag &#8216;scaffold&#8217; %&gt;<\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h3><a title=\"Fileupload\" name=\"Fileupload\"><\/a>4.9 Fileupload<\/h3>\n<p><a href=\"http:\/\/wiki.rubyonrails.org\/rails\/pages\/HowtoUploadFiles\" target=\"_blank\">HowtoUploadFiles<\/a><\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<p>&nbsp;<\/p>\n<h3><a title=\"AJAX\" name=\"AJAX\"><\/a>4.10 AJAX<\/h3>\n<p>depot_l\/app\/views\/layouts\/store.rhtml<\/p>\n<p>&lt;%= stylesheet_link_tag &#8220;depot&#8221; , :media =&gt; &#8220;all&#8221; %&gt;<br \/>\n&lt;%= javascript_include_tag :defaults %&gt;<\/p>\n<p>depot_l\/app\/views\/store\/add_to_cart.rjs<br \/>\npage.replace_html(&#8220;cart&#8221; , :partial =&gt; &#8220;cart&#8221; , :object =&gt; @cart)<\/p>\n<p>depot_l\/app\/controllers\/store_controller.rb<br \/>\ndef add_to_cart<br \/>\nbegin<br \/>\nproduct = Product.find(params[:id])<br \/>\nrescue<br \/>\nActiveRecord::RecordNotFound<br \/>\nlogger.error(&#8220;Attempt to access invalid product #{params[:id]}&#8221; )<br \/>\nredirect_to_index(&#8220;Invalid product&#8221; )<br \/>\nelse<br \/>\n@cart = find_cart<br \/>\n@cart.add_product(product)<br \/>\nend<br \/>\nend<\/p>\n<p>depot_l\/app\/views\/store\/index.rhtml<br \/>\n&lt;% form_remote_tag :url =&gt; { :action =&gt; :add_to_cart, :id =&gt; product } do %&gt;<br \/>\n&lt;%= submit_tag &#8220;Add to Cart&#8221; %&gt;<br \/>\n&lt;% end %&gt;<\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h2><a title=\"Facebooker\" name=\"Facebooker\"><\/a>5. Facebooker<\/h2>\n<p><a href=\"http:\/\/www.ajaxlines.com\/ajax\/stuff\/article\/getting_started_with_facebooker.php\" target=\"_blank\">Facebooker Pretutorial<\/a><\/p>\n<p><a href=\"http:\/\/apps.facebook.com\/facebooker_tutorial\/\" target=\"_blank\">Facebooker offizielles Tutorial<\/a><\/p>\n<p><a href=\"http:\/\/facebooker.rubyforge.org\/\" target=\"_blank\">Facebooker-API<\/a><\/p>\n<p><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\"><br \/>\n<\/a><a href=\"https:\/\/www.mobiehl.de\/index.php\/pc\/ruby-on-rails#index\">zum Inhalt<\/a><\/p>\n<h2><a title=\"Spickzettel\" name=\"Spickzettel\"><\/a>6. Spickzettel<\/h2>\n<p><a href=\"https:\/\/www.mobiehl.de\/images\/ruby-on-rails-cheat-sheet-v1.png\" target=\"_blank\"><img loading=\"lazy\" title=\"http:\/\/www.addedbytes.com\/download\/ruby-on-rails-cheat-sheet-v1\/png\/\" alt=\"http:\/\/www.addedbytes.com\/download\/ruby-on-rails-cheat-sheet-v1\/png\/\" src=\"https:\/\/www.mobiehl.de\/images\/ruby-on-rails-cheat-sheet-v1.png\" width=\"489\" height=\"664\" border=\"0\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Inhalt Tutorials und Referenzen Tools and Environment But What Does It All Mean Testtools GIT &#8211; Version controll Entwicklungszyklus Themen und Komponenten Rake Plugin annotate models Controller &#8211; Action &#8211; Parameter ORM &#8211; Objekt relational mapping Ruby Validation von Modelparametern Associating models Rails Helper Fileupload Ajax Facebooker Spickzettel &nbsp; &nbsp; 1. Tutorials und Referenzen Ruby [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[14],"tags":[],"_links":{"self":[{"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/posts\/34"}],"collection":[{"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/comments?post=34"}],"version-history":[{"count":1,"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/posts\/34\/revisions"}],"predecessor-version":[{"id":35,"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/posts\/34\/revisions\/35"}],"wp:attachment":[{"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/media?parent=34"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/categories?post=34"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mobiehl.de\/wordpress\/pc-knowhow\/wp-json\/wp\/v2\/tags?post=34"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}