<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>rubyspikeのブログ</title>
<link>https://ameblo.jp/rubyspike/</link>
<atom:link href="https://rssblog.ameba.jp/rubyspike/rss20.xml" rel="self" type="application/rss+xml" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<description>ブログの説明を入力します。</description>
<language>ja</language>
<item>
<title>Railsの魔法を解明します（6）</title>
<description>
<![CDATA[ <p><span style="font-weight:bold;">レコードの一覧表示</span></p><p><br>私たちの投稿を掲載する<br><br>私たちのブログアプリでは、最初にすべての投稿タイトルのリストを表示したいと考えています。 そして、ここにいくつかの記事があるデータベースがあるので、実際にここに表示するものがあります！<br><br>開始するには、hello_worldアクションで3つのことが必要であることを思い出してください：<br><br>1 a route<br>2 an action<br>3 view<br><br>ここにもそれぞれのものが必要ですので、/ list_postsのルートを定義して物事を説明しましょう：<br><br>config/routes.rb<br><br>Rails.application.routes.draw do<br>&nbsp; get '/list_posts' =&gt; 'application#list_posts'<br>end<br>application＃list_postsアクションは次を指します：<br><br>app/controllers/application_controller.rb<br><br>class ApplicationController &lt; ActionController::Base<br>&nbsp; def list_posts<br>&nbsp; &nbsp; connection = SQLite3::Database.new 'db/development.sqlite3'<br>&nbsp; &nbsp; connection.results_as_hash = true<br>&nbsp; &nbsp; posts = connection.execute("SELECT * FROM posts")<br>&nbsp; &nbsp; render 'application/list_posts', locals: { posts: posts }<br>&nbsp; end<br>end</p><p><br>私たちのlist_postsアクションの中には、以前のDB初期化ロジックが表示され、次にSELECTクエリがあり、すべての投稿をハッシュとして取得します。 その後、localsとして一緒にそれらをビューに渡すだけです。<br><br>ビューはまだ定義されていないなので、次にそれをしましょう：<br><br>&lt;!-- app/views/application/list_posts.html.erb --&gt;<br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&lt;div class="posts"&gt;<br>&nbsp; &nbsp; &nbsp; &lt;% posts.each do |post| %&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class="post"&gt;<br>&lt;h2 class="title"&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;%= post['title'] %&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/h2&gt;<br>&lt;small class="meta"&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;span class="author"&gt;by &lt;%= post['author'] %&gt; -&lt;/span&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;em class="created_at"&gt;&lt;%= post['created_at'] %&gt;&lt;/em&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/small&gt;<br>&lt;/div&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &lt;hr /&gt;<br>&nbsp; &nbsp; &nbsp; &lt;% end %&gt;<br>&nbsp; &nbsp; &lt;/div&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</p><p><br>ここにはかなりのマークアップがありますが、その大半はこれを除いてよく知られているはずです：<br><br>&lt;% posts.each do |post| %&gt;<br>&nbsp; &lt;!-- ... --&gt;<br>&lt;% end %&gt;</p><p><br>ここでは、ERBビュー内で配列をどのように反復処理できるかを確認します。上記では、posts.eachを使用してポストをループし、各ポストに対して&lt;div&gt;を作成します。 （このポスト変数はブロックの&lt;％end％&gt;の前のどこでも利用できます）。<br><br>ここで注意すべき重要なことは、&lt;％=&gt;とは対照的に&lt;=％&gt;（=を除く）を使用することです。 これにより、戻り値をページに配置せずにRubyを実行することができます。<br><br>それ以外にも、&lt;％= post [‘title’]％&gt;のような行で適切なポスト値をポスト&lt;div&gt;の別の場所に配置するだけです。<br><br>そして、/ list_postsにアクセスすると、3つの投稿のタイトルと、それぞれの著者の名前と作成日が表示されます。<br><br>ユーザーに投稿を表示する<br><br>これで/ list_postsが動作するようになったので、/ show_post /：idのために何かを実装してみましょう。これはユーザーが特定の投稿を読むために行く場所です。<br><br>まず、ルートが必要です。<br><br>### config/routes.rb ###<br>Rails.application.routes.draw do<br>&nbsp; get '/list_posts' &nbsp; &nbsp;=&gt; 'application#list_posts'<br>&nbsp; get '/show_post/:id' =&gt; 'application#show_post'<br>end</p><p><br>ここでは、コントローラーアクションで使用するパラメータとしてIDを取得するためのURLパターンを設定することができます。<br><br>それから、show_postアクションが必要になります：<br><br>### app/controllers/application_controller.rb ###<br>class ApplicationController &lt; ActionController::Base<br># ...<br>def show_post<br>&nbsp; &nbsp; connection = SQLite3::Database.new 'db/development.sqlite3'<br>&nbsp; &nbsp; connection.results_as_hash = true<br>post = connection.execute("SELECT * FROM posts WHERE posts.id = ? LIMIT 1", params['id']).first<br>render 'application/show_post', locals: { post: post }<br>&nbsp; end<br>end</p><p><br>このshow_postアクションでは、まず特定のIDでデータベースから投稿を取得する必要があります。connection.executeでもう一度SQLをDBに対して実行しますが、今回は.firstを呼び出します。その理由は、LIMIT 1の場合のように、connection.executeは常に単一の要素を含むことになっても、配列を返すためです。<br><br>これをデータベースで使用する方法は面白いですが、見てみましょう：<br><br>connection.execute("SELECT * FROM posts WHERE posts.id = ? LIMIT 1", params['id'])<br>私たちの目的には、次の行と同じ効果があります：<br><br>connection.execute("SELECT * FROM posts WHERE posts.id = #{params['id']} LIMIT 1")</p><p><br>オリジナルのステートメントの？文字は、2番目のパラメータの値で置き換えられるプレースホルダです（params [‘id’]）。これは、ユーザーの入力（この場合はURLからの）をSQLステートメントに含めるより安全な方法です。Railsはステートメントが安全であることを確認します。 2番目のステートメントは安全ではありません。ユーザーの入力を直接ステートメントに含めたからです。この技術は、SQLインジェクション攻撃に対する保護と呼ばれています。 このシリーズの後半でこのトピックに着きます。<br><br>しかし、私たちのアクションの最後の行に戻ると、私たちは私たちの投稿をshow_postビューに渡すだけであることがわかります。 言えば、今ここでそれを定義しましょう：<br><br>&lt;!-- app/views/application/show_post.html.erb --&gt;<br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&lt;div class="post"&gt;<br>&nbsp; &nbsp; &nbsp; &lt;h2 class="title"&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &lt;%= post['title'] %&gt;<br>&nbsp; &nbsp; &nbsp; &lt;/h2&gt;<br>&lt;small class="meta"&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &lt;span class="author"&gt;by &lt;%= post['author'] %&gt; -&lt;/span&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &lt;em class="created_at"&gt;&lt;%= post['created_at'] %&gt;&lt;/em&gt;<br>&nbsp; &nbsp; &nbsp; &lt;/small&gt;<br>&lt;p class="body"&gt;&lt;%= post['body'] %&gt;&lt;/p&gt;<br>&nbsp; &nbsp; &lt;/div&gt;<br>&lt;br /&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</p><p><br>このビューは基本的にlist_postsビューと同じですが、ループを持たず、ポストボディをレンダリングします。<br><br>/ show_post / 1にアクセスと、投稿の詳細と投稿の本文が表示されます。<br><br>リンク<br><br>最後に、これらの2つのページの間にいくつかのリンクを作ってみましょう：<br><br>&lt;!-- app/views/application/show_post.html.erb --&gt;<br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&lt;!-- link to list of posts --&gt;<br>&nbsp; &nbsp; &lt;a href="/list_posts"&gt;Back to Posts&lt;/a&gt;<br>&lt;div class="post"&gt;<br>&nbsp; &nbsp; &nbsp; &lt;!-- ... --&gt;<br>&nbsp; &nbsp; &lt;/div&gt;<br>&lt;br /&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br>&lt;!-- app/views/application/list_posts.html.erb --&gt;<br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&lt;div class="posts"&gt;<br>&nbsp; &nbsp; &nbsp; &lt;% posts.each do |post| %&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class="post"&gt;<br>&lt;h2 class="title"&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;!-- link to post --&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;a href="/show_post/&lt;%= post['id'] %&gt;"&gt;&lt;%= post['title'] %&gt;&lt;/a&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/h2&gt;<br>&lt;!-- ... --&gt;<br>&lt;/div&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &lt;hr /&gt;<br>&nbsp; &nbsp; &nbsp; &lt;% end %&gt;<br>&nbsp; &nbsp; &lt;/div&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</p><p><br>showビューからlistビューへのリンクは単純で静的なリンクです：<br><br>&lt;a href="/list_posts"&gt;Back to Posts&lt;/a&gt;<br>listビューのリンクはループの中にあったので、少し複雑になります：<br><br>&lt;a href="/show_post/&lt;%= post['id'] %&gt;"&gt;&lt;%= post['title'] %&gt;&lt;/a&gt;<br>ここでは、投稿IDを使用してhrefを動的に作成し、リンクテキストを各投稿の投稿のタイトルに設定します。<br><br>DB接続用の共有ロジックの抽出<br><br>show_postで、list_postsで使用したデータベースに接続するために同じ2行を繰り返していることに気づいたかもしれません。このロジックをコントローラー内の独自の接続メソッドに移して、両方のアクションを調整して使用してみましょう。<br><br>class ApplicationController &lt; ActionController::Base<br>&nbsp; def list_posts<br>&nbsp; &nbsp; posts = connection.execute("SELECT * FROM posts")<br>&nbsp; &nbsp; render 'application/list_posts', locals: { posts: posts }<br>&nbsp; end<br>def show_post<br>&nbsp; &nbsp; post = connection.execute("SELECT * FROM posts WHERE posts.id = &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ? LIMIT 1", params['id']).first<br>render 'application/show_post', locals: { post: post }<br>&nbsp; end<br>private<br>def connection<br>&nbsp; &nbsp; db_connection = SQLite3::Database.new 'db/development.sqlite3'<br>&nbsp; &nbsp; db_connection.results_as_hash = true<br>&nbsp; &nbsp; db_connection<br>&nbsp; end<br>end</p><p><br>これは素晴らしいことです。なぜなら、後でデータベース接続について変更する必要がある場合、変更をただちに行うことができるからです。さらに、他のアクションでデータベース接続を使用する必要がある場合は、connectionを使用することもできます。</p>
]]>
</description>
<link>https://ameblo.jp/rubyspike/entry-12344210373.html</link>
<pubDate>Sat, 13 Jan 2018 19:15:40 +0900</pubDate>
</item>
<item>
<title>Railsの魔法を解明します（5）</title>
<description>
<![CDATA[ <h3 id="0173" name="0173">アプリケーションでデータを持続させる</h3><p id="f12a" name="f12a">データベースバックアップアプリケーション</p><p id="f12a" name="f12a">&nbsp;</p><p id="ace6" name="ace6">URLを介してデータを渡すことは、Webアプリケーションに動的コンテンツを応答させるための1つの方法ですが、動的Webの最も一般的なパラダイムは「データベースバックアップアプリケーション」です。サーバーはクライアントにレスポンスを返すため、バックエンドデータベースにクエリを行います。</p><p id="ace6" name="ace6">&nbsp;</p><p id="a2d2" name="a2d2">このユースケースでは、レスポンスの動的性質はリクエスト内のデータからではなく、バックエンドデータベースの「状態」から得られます。</p><p id="a2d2" name="a2d2">&nbsp;</p><p id="df75" name="df75">これは大きな話題で、いくつかのセクションを使って説明します。 私たちは、このパラダイムとのやりとりを歩くために、実際のWebアプリケーション、ブログを作成します。</p><p id="df75" name="df75">&nbsp;</p><p id="2a6d" name="2a6d">データベースの準備</p><p id="2a6d" name="2a6d">&nbsp;</p><p id="9cf3" name="9cf3">まずは、作業するブログ記事のデータベースを用意しましょう。 Railsに組み込まれている軽量データベースであるSQLite3を使用します。</p><p id="9cf3" name="9cf3">&nbsp;</p><p id="9e90" name="9e90">データベースの記事を扱う際には、以下について考える必要があります：</p><p id="9e90" name="9e90">&nbsp;</p><p id="115f" name="115f">１データベースの構造（テーブルとその列）</p><p id="115f" name="115f">&nbsp;</p><p id="f0a6" name="f0a6">２データそのもの（個々の投稿を表す行）</p><p id="f0a6" name="f0a6">&nbsp;</p><p id="9e83" name="9e83">構造については、投稿テーブルに各投稿の詳細を保持する必要があります。 各投稿には次の属性があります：</p><ul><li id="bedd" name="bedd"><code>id</code>&nbsp;(integer)</li><li id="ddf1" name="ddf1"><code>title</code>&nbsp;(string)</li><li id="df23" name="df23"><code>body</code>&nbsp;(text)</li><li id="84b7" name="84b7"><code>author</code>&nbsp;(string)</li><li id="606b" name="606b"><code>created_at</code>&nbsp;(datetime)</li></ul><p id="526a" name="526a">これらはそれぞれ、データベース内のpostsテーブルの列になります。</p><p id="526a" name="526a">&nbsp;</p><p id="05b9" name="05b9">このテーブルを作成するには、次のSQLファイルを使用します。</p><p id="fc41" name="fc41">db/posts.sql</p><pre id="4ac5" name="4ac5">CREATE TABLE "posts" (  "id"         INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,  "title"      varchar,  "body"       text,  "author"     varchar,  "created_at" datetime NOT NULL);</pre><p id="4be6" name="4be6">postsテーブルに、次のCSV（Comma-Separated Value）ファイルを使用してダミーポストをいくつか挿入します。</p><p id="1cc4" name="1cc4">db/posts.csv</p><pre id="e18d" name="e18d">1,Blog 1,Lorem ipsum dolor sit amet.,Brad,2014-12-072,Blog 2,Lorem ipsum dolor sit amet.,Chris,2014-12-083,Blog 3,Lorem ipsum dolor sit amet.,Kevin,2014-12-09</pre><p id="aa94" name="aa94">したがって、データベースを作成し、それに対してSQLを実行し、内部に投稿テーブルを作成するには、「Railsルートディレクトリ」、つまりapp とdbのようなディレクトリを含むRailsアプリケーションの最上位ディレクトリ で以下の命令を実行します：</p><pre id="f9ff" name="f9ff">sqlite3 db/development.sqlite3 &lt; db/posts.sql</pre><p id="f216" name="f216">このプロジェクトでは、DBMS（データベース管理システム）としてSQLite3を使用します。 そこには他にはるかに強力なDBMSがありますが、SQLite3はRailsのデフォルトの開発データベースであり、うまく機能するため、これを使用します。</p><p id="f216" name="f216">&nbsp;</p><p id="b53b" name="b53b">このコマンドの結果、db / development.sqlite3ファイルが作成されます。このファイルには、SQLite3データベースが含まれています。 そして、私たちはそれに対してposts.sqlファイルを実行したので、postsテーブルを持ちます。</p><p id="06e8" name="06e8">SQLite3コンソールを実行して見てみましょう：</p><pre id="2de4" name="2de4">$ sqlite3 db/development.sqlite3</pre><pre id="74b0" name="74b0">sqlite&gt; .tablesposts</pre><pre id="5eb9" name="5eb9">sqlite&gt; SELECT * FROM posts;sqlite&gt;</pre><p id="3d17" name="3d17">私たちの投稿テーブルはありますが、そのSELECTからの空白の返信からわかるように、まだテーブルに投稿行はありません。</p><p id="3d17" name="3d17">&nbsp;</p><p id="db5f" name="db5f">CSVファイルをインポートすることで、この問題を解決できます。 まずSQLite3にCSVファイルをインポートしていることを伝える必要があります。次に、このようにインポートを実行できます：</p><pre id="09cd" name="09cd">sqlite&gt; .mode csvsqlite&gt; .import db/posts.csv posts</pre><p id="b5cd" name="b5cd">さて、私たちが持っているものを見てみましょう：</p><pre id="00b2" name="00b2">sqlite&gt; SELECT * FROM posts;1,"Blog 1","Lorem ipsum dolor sit amet.",Brad,2014-12-072,"Blog 2","Lorem ipsum dolor sit amet.",Chris,2014-12-083,"Blog 3","Lorem ipsum dolor sit amet.",Kevin,2014-12-09</pre><pre id="c844" name="c844">sqlite&gt; SELECT title FROM posts;"Blog 1""Blog 2""Blog 3"</pre><pre id="98d5" name="98d5">sqlite&gt; SELECT created_at FROM posts WHERE id=1;2014-12-07</pre><p id="7adb" name="7adb">.quitコマンドを使用してsqlite REPLを終了することができます。これでいくつかの記事データを持っているので、色々な試しに行きましょう。</p><p id="7adb" name="7adb">&nbsp;</p><p id="433b" name="433b">データベースと対話する</p><p id="433b" name="433b">&nbsp;</p><p id="d414" name="d414">このデータベースをRailsで扱う方法について説明する前に、純粋なRubyを使ってこのデータベースとやりとりする方法を見てみましょう。</p><p id="d414" name="d414">&nbsp;</p><p id="e237" name="e237">RubyのSQLite3データベースに接続する方法が必要です。幸いなことは、Rubyライブラリsqlite3があります。</p><pre id="629b" name="629b">$ irb</pre><pre id="5321" name="5321">&gt; require 'sqlite3'=&gt; true</pre><pre id="cb8c" name="cb8c"># setup db connection&gt; connection = SQLite3::Database.new 'db/development.sqlite3'=&gt; #&lt;SQLite3::Database:0x000000039ff288 ... &gt;</pre><p id="a698" name="a698">ここでは、ライブラリを利用できるようにするためにライブラリを用意する必要があります。次に、dbite.sqlite3データベースに問い合わせるためのSQLite3&nbsp;:: Databaseオブジェクトをインスタンス化します。</p><p id="a698" name="a698">&nbsp;</p><p id="39a9" name="39a9">これで、Rubyを使用してデータベースに対してSQLを実行するようになりました。</p><pre id="2348" name="2348">&gt; post_arrays = connection.execute 'SELECT * FROM posts'=&gt; [     [1, "Blog 1", "Lorem ipsum dolor sit amet.", "Brad", "2014-12-07"],     [2, "Blog 2", "Lorem ipsum dolor sit amet.", "Chris", "2014-12-08"],     [3, "Blog 3", "Lorem ipsum dolor sit amet.", "Kevin", "2014-12-09"]   ]</pre><p id="be80" name="be80">connection.executeにSQL文字列を渡してデータベースに対して実行させます。 このconnection.executeコールからの戻り値は配列の配列であり、それぞれがテーブル行を表します。</p><p id="be80" name="be80">&nbsp;</p><p id="7369" name="7369">ポストローを表す配列は、次の形式で値を保持します。</p><pre id="b0b0" name="b0b0">[id, title, body, author, created_at]</pre><p id="a057" name="a057">テーブルの列を宣言した順序なので意味がありますが、特に便利ではありません。</p><p id="a057" name="a057">&nbsp;</p><p id="194b" name="194b">たとえば、投稿のタイトルが必要な場合、タイトルはこれらの配列のインデックス1にあることを知っておく必要があります。その後、post [1]を使用してタイトル文字列を取得します。代わりに、これらの投稿をハッシュとしてGoogleに返すことはうれしいので、投稿のタイトルが必要な場合は、post [‘title’]を使用して取得することができます。</p><p id="194b" name="194b">&nbsp;</p><p id="df91" name="df91">便利なことに、これらの行をハッシュとして返すように接続を宣言することができます。</p><pre id="3bf1" name="3bf1">&gt; connection.results_as_hash = true=&gt; true</pre><pre id="7811" name="7811">&gt; connection.execute('SELECT * FROM posts').first=&gt; {     "id"         =&gt; 1,     "title"      =&gt; "Blog 1",     "body"       =&gt; "Lorem ipsum dolor sit amet.",     "author"     =&gt; "Brad",     "created_at" =&gt; "2014-12-07",     0 =&gt; 1,     1 =&gt; "Blog 1",     2 =&gt; "Lorem ipsum dolor sit amet.",     3 =&gt; "Brad",     4 =&gt; "2014-12-07"   }</pre><p id="35a1" name="35a1">今度はSELECTから返された配列の最初の要素を見ると、post [title]というポストタイトルを得ることができるハッシュが戻ってくることがわかります。</p><p id="35a1" name="35a1">&nbsp;</p><p id="97b8" name="97b8">ちなみに、タイトルは整数キー1でハッシュにも格納されているので、post [1]でタイトルを見つけることはできます。</p><p id="97b8" name="97b8">&nbsp;</p><p id="bbcf" name="bbcf">これらのキーは、配列がもはや配列でなくても、ハッシュが前の配列とまったく同じように動作することを可能にします（少なくとも[]を使った値アクセスに関して）。</p><p id="bbcf" name="bbcf">&nbsp;</p><p id="bbcf" name="bbcf">賢いですね！</p><p id="bbcf" name="bbcf">&nbsp;</p><p id="8310" name="8310">データベースにいくつかの投稿があり、Rubyでそれらを手に入れることができるようになった今、私たちのWebアプリケーションを構築し始めましょう。</p>
]]>
</description>
<link>https://ameblo.jp/rubyspike/entry-12338553931.html</link>
<pubDate>Sat, 23 Dec 2017 15:13:02 +0900</pubDate>
</item>
<item>
<title>Railsの魔法を解明します（4）</title>
<description>
<![CDATA[ <p><span style="font-weight:bold;">アプリケーションを動的にします</span></p><p><br>動的サーバーの応答</p><p><br>これで、リクエストをアクションに送信するルートが得られました。アクションをビューに表示しましたが、これまでのすべてのコンテンツは静的でした。</p><p><br>私たちのRailsアプリケーションは本質的に、HTML文書を取り出しHTTPレスポンスにラップしてクライアントに返すファイルサーバです。</p><p><br>これは初期のWebの主なパラダイムで、Webサーバーがリクエストに応答して静的なドキュメントを返送します。しかし、現代のウェブは、リクエストに応答するために即座に応答を集めることができるウェブの「アプリケーション」を生み出しました。</p><p><br>Webアプリケーションの動的な性質は、主に次の2つのソースから来ています：</p><p><br>１クライアントは、サーバーが応答するURL内にデータを埋め込みます。 たとえば、ブラウザ「<a href="https://www.google.com/search?q=robots">https://www.google.com/search?q=robots</a>」を入力すると、「ロボット」の検索結果のみを含むウェブページを動的に組み立てるよう、Googleに求めています。</p><p><br>２サーバーは、サーバーのデータベース内のデータの内部状態に基づいてデータに応答します。 たとえば、ブログを訪問すると、サーバーはデータベースに格納されているブログ投稿を取得し、このデータに基づいてWebページを動的に組み立てます。</p><p><br>この2つのシナリオを次のトピックで詳しく見ていきます。</p><p><br>動的ドキュメントと組み込みRuby</p><p><br>ERBは「組み込みRuby」の略です。 Rubyコードをテキスト文書に埋め込んで動的な文書を作成できるテンプレートエンジンです。</p><p><br>ERBテンプレートでは、識別するためにRubyコードを&lt;％…％&gt;タグの内側に配置する必要があります。 さらに、&lt;％= ruby_expression％&gt;構文を使用して、ルビコードの値をHTMLドキュメントに入れることができます。</p><p><br>テンプレートをHTMLドキュメントに「レンダリング」するときは、「レンダリングエンジン」（この場合はERBレンダリングエンジン）を使用してテンプレートを実行してから、埋め込まれたRubyコードを実行して出力します。</p><p><br>たとえば、このERBテンプレート</p><p><br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&nbsp; &nbsp; &lt;% name = "John" %&gt;<br>&nbsp; &nbsp; &lt;p&gt;Hello, &lt;%= name %&gt;!&lt;/p&gt;<br>&nbsp; &lt;/body&gt;<br>&lt;/html&gt;</p><p><br>以下にレンダーします</p><p><br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&nbsp; &nbsp; &lt;p&gt;Hello, John!&lt;/p&gt;<br>&nbsp; &lt;/body&gt;<br>&lt;/html&gt;</p><p><br>この例では、ERBテンプレート内の変数名に値「John」を割り当ててから、HTML文書のレンダリングに使用しました。テンプレートは常に同じ結果にレンダリングされるので、これは面白くないです。</p><p><br>テンプレートを以下のように残すでけで</p><p><br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&nbsp; &nbsp; &lt;p&gt;Hello, &lt;%= name %&gt;!&lt;/p&gt;<br>&nbsp; &lt;/body&gt;<br>&lt;/html&gt;</p><p><br>テンプレートの外側から変数名前の値を渡します。変数名前の値が “John”の場合、このテンプレートは同じ結果にレンダリングされます。</p><p><br>クエリパラメータに応答します</p><p><br>これで、ERBテンプレートを使用して動的ドキュメントをレンダリングする方法がわかったので、リクエストURLに名前を渡して、 “Hello、John！”のようなカスタム挨拶に応答させます。</p><p><br>これを行うために、HTML文書の名前をhello_world.html.erbに変更します。 Railsでは、この規約は、最終的にHTML文書にレンダリングされるERBテンプレートであることを意味します。</p><p><br>ERBテンプレートはよく見かけがあります。</p><p><br>app/views/application/hello_world.html.erb<br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&nbsp; &nbsp; &lt;p&gt;Hello, &lt;%= name %&gt;!&lt;/p&gt;<br>&nbsp; &lt;/body&gt;<br>&lt;/html&gt;</p><p><br>クライアントからサーバーに値を渡す方法はいくつかありますが、最も基本的なのはURLのクエリパラメータ（http：// localhost：3000 / hello_world？name = Johnなど）を使用することです。パスの？後ろの部分name = Johnは、サーバーによって解釈されるクエリ文字列です。</p><p><br>アクションでこれらのパラメータにアクセスする方法を見てみましょう：</p><p><br>app/controllers/application_controller.rb<br>class ApplicationController &lt; ActionController::Base<br>&nbsp; def hello_world<br>&nbsp; &nbsp; name = params['name']<br>&nbsp; &nbsp; render 'application/hello_world', locals: { name: name }<br>&nbsp; end<br>end</p><p><br>Railsはクエリパラメータをparamsというハッシュに解析します。 この処理では、名前クエリパラメータの値を取得し、ERBレンダリングエンジンに渡してhello_world.html.erbテンプレートをレンダリングします。</p><p><br>もし前のコード行が混乱しているように見える場合は、以下のように書くこともできます。</p><p><br>render('application/hello_world', { locals: { name: name } })</p><p><br>これは実際には2つの引数を持つメソッド呼び出しであり、2番目の引数はキー/値のペアを持つハッシュです。キーはlocalsで、値は別のハッシュです。ERBエンジンでハッシュの：localsキーが見つかると、そのキーの値を使用してテンプレートがレンダリングされます。</p><p><br>Now if you type into your browser <a href="http://localhost:3000/hello_world?name=John">http://localhost:3000/hello_world?name=John</a> you will see "Hello, John!".</p><p><br>これはうまくいきますが、我々はまた少し問題を導入しました。つまり、/ hello_worldを単独で打つと、次のようになります：</p><p><br>Hello, !</p><p><br>その理由は、nameはここにはnilであります。 キーnameで渡されるクエリパラメータはありません。 これはテンプレートがレンダリングされるときに上記のメッセージが不鮮明になることがあります。</p><p><br>これをいくつかの方法で修正することができますが、アクション内で名前をデフォルト値に設定しましょう：</p><p><br>app/controllers/application_controller.rb<br>class ApplicationController &lt; ActionController::Base<br>&nbsp; def hello_world<br>&nbsp; &nbsp; name = params['name'] || "World"<br>&nbsp; &nbsp; render 'application/hello_world', locals: { name: name }<br>&nbsp; end<br>end</p><p><br>これでクエリ文字列にnameを渡さなければ、hello, wolrd!をみることができます。<br>params [‘name’] || 上の ‘world’の行、|| （論理OR）は、何かがparams [‘name’]にあるかどうかを調べるためのチェックとして機能します。 その値がtruthy（falseまたはnil以外の値）の場合、単に値を返します。 それ以外の場合（「OR」）、「World」を返します。</p><p><br>URL取得パターンにレスポンス</p><p><br>クエリパラメータは、サーバーにデータを渡すのに便利ですが、それだけではありません。 ルーティングとデーターキャプチャのためのURLマッチングパターンを指定することもできます。</p><p><br>たとえば、routes.rbファイルに新しい行を追加します。</p><p><br>config/routes.rb<br>Rails.application.routes.draw do<br>&nbsp; get '/hello_world/' =&gt; 'application#hello_world'<br>&nbsp; get '/hello/:name' &nbsp;=&gt; 'application#hello_world'<br>end</p><p><br>/ hello / Johnを訪問すると Hello、John！も表示されます。</p><p><br>パターン / hello /：nameは、/ hello / JohnのようなURLを持つリクエストをApplicationControllerのhello_worldアクションにルーティングするようにRailsに指示します。nameのプレースホルダーにマッチングする値、この場合、Johnはコントローラ内でparams [‘name’]を使用してアクセス可能になります。</p><p><br>上記の私たちのルートについて最後に気づくべきことは、同じアクションを指す2つのルートがあることです。これには何も問題はありません.Railsは単にURLパターンに一致する最初のルートを使用します。</p>
]]>
</description>
<link>https://ameblo.jp/rubyspike/entry-12336840904.html</link>
<pubDate>Sat, 16 Dec 2017 18:43:11 +0900</pubDate>
</item>
<item>
<title>Railsの魔法を解明します（3）</title>
<description>
<![CDATA[ <p><span style="font-weight:bold;">私たちの最初のアプリ</span></p><p><br>アプリをセットアップする</p><p><br>このシリーズの最初の2つのセクションでは、読者はRuby on Railsを学ぶためのブログアプリを構築するように求められます。これを開始するには、以下のコマンドを実行してスターターアプリをクローンします。</p><p><br># make sure to use ruby version 2.2<br>$ git clone // wait for edit<br>$ cd demystifying_rails_app_template<br>$ bundle exec bundle install<br>$ bundle exec rails server<br>$ bundle exec railsサーバが起動したら、ブラウザでhttp：// localhost：3000 /にアクセスするだけでアプリケーションを使用できます。</p><p><br>このRailsアプリを起動して実行したら、HTTPリクエストに応答させましょう。</p><p><br>具体的には、ブラウザから/ hello_worldへのリクエストで、Hello、worldというテキストがブラウザに表示されるようにしたいとします。</p><p><br>Railsでは、本質的にと見るとこれは2つのステップのプロセスです。</p><p><br>１ リクエストの送信先を定義します<br>２ この種のリクエストを処理するコードを定義します<br>これらの1つ目は、ルートを宣言することによって実現されます。<br>２つ目は、コントローラに定義されたメソッドによって実現されます。このようなリクエストを処理するロジックを含む、コントローラにあるメソッドをアクションと呼びます。</p><p><br>次のいくつかの章では、最初のRailsアプリケーションを構築するための手順を説明します。</p><p><br>リクエストと応答の送信</p><p><br>ルートの定義</p><p><br>Railsアプリケーションの「入り口」は、Railsアプリケーションに着信リクエストを処理するコードの場所を知らせる「ルート」です。</p><p><br>ルートの必要性を証明するために、先にパスをアクセスしましょう。</p><p><br>http：// localhost：3000 / hello_worldにアクセスし、何が起こるかを見てください。</p><p><br>Routing Error<br>No route matches [GET] “/hello_world”</p><p><br>まだルートを定義していないため、このエラーが出てしまうんです。</p><p><br>このようなリクエストを、新しいアクションにポイントするルートを定義することでこのようなエラーが修正できます。</p><p><br>Railsルートファイルには、アプリのルートリストが含まれています。</p><p><br>各ルートは、HTTPメソッド（GET、POSTなど）とURLパターンの組み合わせで、コントローラーとアクションの組み合わせにマッピングされます。</p><p><br>このエラーは、GETリクエストとURLパターン/ hello_worldの組み合わせのルートがないことを示しています。</p><p><br>configディレクトリのroutes.rbファイルにルートを定義しましょう。</p><p><br>config/routes.rb<br>Rails.application.routes.draw do<br>&nbsp;get ‘/hello_world’ =&gt; ‘application#hello_world’<br>end</p><p><br>route.rbの中のブロックで、それぞれのHTTPメソットの後に、自分で名前をつけるメソッドが利用できます。</p><p><br>次に、URLパターンを定義し、コントローラと、このタイプのリクエストの処理コードが存在するアクションの組み合わせを定義します。</p><p><br>ここでは、このリクエストを処理するコードがApplicationControllerのhello_worldアクションに存在することを定義していますが、まだそれらを定義していないので、次にそれを行います。</p><p><br>ここで、http：// localhost：3000 / hello_worldページを更新すると、次のエラーが発生します。</p><p><br>Unknown action<br>The action ‘hello_world’ could not be found for ApplicationController</p><p><br>次のセクションでは、このルートのアクションをApplicationControllerで定義することで、この問題に取り組んでいきます。</p><p><br>アクションの定義</p><p><br>最初の指定ルートとして、ApplicationControllerに存在すべきhello_worldアクションを定義する時間です。</p><p><br>app/controllers/application_controller.rb<br>class ApplicationController &lt; ActionController::Base<br>&nbsp; def hello_world<br>&nbsp; &nbsp; render plain: 'Hello, World!'<br>&nbsp; end<br>end</p><p><br>コントローラーアクションの目的は、HTTPリクエストに応答し、適切なHTTP応答を構築することです。このアクションの場合、私たちはリクエストの詳細に完全に気を配らず、単にHello、World！ 何の関係もないメッセージを構築します。ここでは、renderメソッドの呼び出しはHTTP応答を設定するためであります。上記のrenderの呼び出しでは、「Hello、World！」を引き数として渡しました。したがって、生成されたレスポンスはtext / plainのコンテンツタイプとHello！World！の本文を持ちます。</p><p><br>レスポンスは次のようになります。</p><p><br>Cache-Control:max-age=0, private, must-revalidate<br>Connection:Keep-Alive<br>Date:Tue, 23 Feb 2016 01:21:23 GMT<br>Etag:W/"65a8e27d8879283831b664bd8b7f0ad4"<br>Server:WEBrick/1.3.1 (Ruby/2.3.0/2015-12-25)<br>X-Content-Type-Options:nosniff<br>X-Frame-Options:SAMEORIGIN<br>X-Request-Id:24c23eec-8a37-49d9-bcaf-4f5b3f18aaaa<br>X-Runtime:0.021203<br>X-Xss-Protection:1; mode=block<br>Hello, World!</p><p><br>Rails内の応答を見ると、デバッガを使ってレスポンスを調べることができます。</p><p><br>render plain: 'Hello, World!'<br>binding.pry<br>### in Pry's console ###<br>response.body &nbsp; &nbsp; &nbsp; &nbsp; # =&gt; "Hello, World!"<br>response.content_type # =&gt; "text/plain"<br>response.status &nbsp; &nbsp; &nbsp; # =&gt; 200</p><p><br>これからいろいろなrenderの使い方を見ていきますが、今はrenderの仕事がコントローラのアクションの中核的な役割の1つ、つまりHTTPレスポンスの構築を達成することであることを認識すれば十分です。</p><p><br>さらに、上のApplicationControllerクラスはActionController :: Baseから継承しています。 レンダリングメソッド（他にも多数）は、この継承のおかげで利用可能になりました。</p><p><br>ビューを使ってHTMLをレンダーする</p><p><br>私たちのルートがaction / hello_worldへのリクエストを適切に処理することができました。アクションをHTMLをレンダーするを変更するにしましょう。</p><p><br>app/controllers/application_controller.rb<br>class ApplicationController &lt; ActionController::Base<br>&nbsp; def hello_world<br>&nbsp; &nbsp; render inline: '&lt;em&gt;Hello, World!&lt;/em&gt;'<br>&nbsp; end<br>end</p><p><br>ここでは、plain：の代わりにinline：を使用して、レスポンスのコンテンツタイプをHTMLに設定して、レスポンスボディ文字列をレンダーに渡します。<br>レスポンスは次のようになります。</p><p><br>HTTP/1.1 200 OK<br>Cache-Control: max-age=0, private, must-revalidate<br>Connection: Keep-Alive<br>Content-Length: 22<br>Content-Type: text/html; charset=utf-8<br>Date: Tue, 23 Feb 2016 02:44:36 GMT<br>Etag: W/"1e401bc81108cb3e3dba191111bf9059"<br>Server: WEBrick/1.3.1 (Ruby/2.3.0/2015-12-25)<br>X-Content-Type-Options: nosniff<br>X-Frame-Options: SAMEORIGIN<br>X-Request-Id: a2eac900-60da-460d-9757-94d8c41c4624<br>X-Runtime: 0.252767<br>X-Xss-Protection: 1; mode=block<br>&lt;em&gt;Hello, World!&lt;/em&gt;</p><p><br>上記のほとんどは、前回のリスポンスは非常に似ています。いくつかの違いがありますが、その違いの1つはレスポンス本文にemタグがラップされていることです。</p><p><br>Rails内のレスポンスオブジェクトも調べてみましょう：<br># assuming we're inside the hello_world action above...<br>render inline: '&lt;em&gt;Hello, World!&lt;/em&gt;'<br>binding.pry<br>### inside Pry ###<br>response.body &nbsp; &nbsp; &nbsp; &nbsp; # =&gt; "&lt;em&gt;Hello, World!&lt;/em&gt;"<br>response.content_type # =&gt; "text/html"<br>response.status &nbsp; &nbsp; &nbsp; # =&gt; 200</p><p><br>ここでは、plain：の代わりにinline：を使用することで、コンテンツタイプがtext / htmlに適切に設定されていることがわかります。</p><p><br>今ページを更新すると、Hello、World！が表示されます。 text / htmlコンテンツタイプとHTMLレスポンス本文文字列の&lt;em&gt;タグのおかげで、ブラウザのイタリック体でメッセージが表示されます。</p><p><br>ビューを使用したコンテンツ</p><p><br>今のアクションによってリクエストが処理されていますが、それには間違いがあります。私たちのアクションにはコンテンツがあります。</p><p><br>ここでの問題は、コントローラの仕事はコンテンツを保持することではなく、それは…まあ、制御することです。</p><p><br>きれいに書かれたコントローラアクションは、アプリケーションの他の部分の呼び出しを調整したり、必要なときにそれらの結果をまとめたりすることを除いて、それ自体はほとんど行いません。</p><p><br>コントローラアクションは単にリクエスト処理のディレクターに過ぎず、アプリケーションの他の部分に他の責任を委任する必要があります。</p><p><br>しかし、すでに、私たちのコンテンツは、HTMLメッセージを保持しています。<br>これを修正するには、そのHTMLをアクションから外しましょう。</p><p><br>単純なビューの作成</p><p><br>HTMLコンテンツはビューに属しています。したがって、HTMLコンテンツを保持するビューを作成してみましょう。</p><p><br>&lt;!-- app/views/application/hello_world.html --&gt;<br>&lt;html&gt;<br>&nbsp; &lt;body&gt;<br>&nbsp; &nbsp; &lt;p&gt;Hello, World!&lt;/p&gt;<br>&nbsp; &lt;/body&gt;<br>&lt;/html&gt;</p><p><br>これは以前と同じHTMLですが、今では独自のビューファイルに保存されています。 これが重要なので、どこに配置したのか注意してください。</p><p><br>app/views/application/hello_world.html</p><p><br>すべてのビューはapp / viewsディレクトリにあります。そこから、それらを使用するコントローラとアクションに対応するディレクトリに配置されます。</p><p><br>ここでは、app / views / application / hello_world.htmlファイルが残っています。ビューが定義された状態で、コントローラでそれを利用しましょう：</p><p><br>### app/controllers/application_controller.rb ###<br>class ApplicationController &lt; ActionController::Base<br>&nbsp; def hello_world<br>&nbsp; &nbsp; render 'application/hello_world'<br>&nbsp; end<br>end</p><p><br>NOTE：ページを再ロードする前に、Railsサーバを再起動してください。</p><p><br>さて、レンダーはすでに数回使用されていますが、ここでは単に文字列を渡すだけ。さらに、この文字列は、作成したばかりのビューのパスと一致することに注意してください。</p><p><br>その結果、hello_worldアクションは、新しく定義されたapplication / hello_worldビューを使用してHTMLレスポンスボディをレンダリングします。</p><p><br>レンダリングをこの方法で使用することは、以下のことと同じです。</p><p><br>render inline: File.read('app/views/application/hello_world.html')</p><p><br>ビューを指し示しているのか、アクション自体のレスポンスボディを設定しているのかに関わらず、常にHTTPレスポンスボディを設定するのはレンダリングの仕事です。<br>上で指摘したように、コンテンツをコントローラに置いたままにしておくのは悪い習慣なので、上のようなレンダー呼び出しレンダリングビューが表示されるのは一般的です。</p>
]]>
</description>
<link>https://ameblo.jp/rubyspike/entry-12336020030.html</link>
<pubDate>Wed, 13 Dec 2017 13:05:43 +0900</pubDate>
</item>
<item>
<title>Railsの魔法を解明します（2）</title>
<description>
<![CDATA[ <p><span style="font-weight:bold;">HTTP and Web&nbsp;Apps</span></p><p><br>いろんな意味では、ウェブアプリの開発に関して全てHTTPに関わっています。この事実はRailsのようなフレームワークを使って開発することにつれ急速に不明瞭になってしまうんです。きちんと覚えていただきたいのは、ウェブアプリの基礎的パラダイムは、あるHTTPリクエストを応答し、相応のHTTPリスポンスを作ることです。数多いのRailsのコンベンションズの存在はただそのプロセスを少し容易にしたいからです。</p><p><br><span style="font-weight:bold;">クライアント サーバー モデル</span></p><p><br>Railsのウェブアプリにおいては、クライアントはウェブブラウザであり、ウェブアプリはサーバー上で稼働しています。</p><p><br>任意の相互動作はブラウザからHTTPリクエストを送信するはじめ、アプリは以下の動作をとります。</p><p><br>１そのリクエストを処理する場所を特定します。<br>２ 事前定義されたロジックでリクエストを処理します。<br>３ 応答（リスポンス）を構築する。</p><p>&nbsp;<br>これが完了すると、アプリはブラウザにHTTP応答を返します。ブラウザはユーザに応答を表示します。</p><p><br><span style="font-weight:bold;">すべてのクライアントとサーバーとの対話がHTTPリクエストから始まる</span></p><p><br>HTTPリクエストには3つの部分があります。</p><p><br>1 リクエストライン。<br>２ リクエストヘッダー<br>３ リクエスメッセージ本文</p><p><br>このシリーズでは、私たちはリクエストラインとそれに特に関わる2つの部分だけに注意します：</p><p><br>１ リクエスト メソッド<br>２ リクエスト パス</p><p><br>GETとポストは通常のHTTPメソッド、/hello_worldと/create_postはパスの例です。</p><p><br>パスは、ドメインの後に/があるURLで始まるURLの部分です。したがって、URL <a href="http://www.launchschool.com/books">http://www.launchschool.com/books</a>の場合、/ booksはパスです。</p><p><br>以下のようなリクエストがWebアプリに出ます：</p><p><br>GET /hello_world<br>POST /create_post</p><p><br>そして、メソッドとパスの組み合わせに基づいて、それらと何をするかを決定します。</p><p><br><span style="font-weight:bold;">すべてのクライアント — サーバーインタラクションがHTTP応答で終了します</span></p><p><br>HTTP応答には3つの部分があります。</p><p><br>１ ステータスコード<br>２ ヘッダー<br>３ 本文（body）</p><p><br>ステータスコードは、サーバーがどのように処理したかの総体的な結果をクライアントに伝えます。よく出た値は、200（OK）、404（リソースが見つからない）、500（サーバー側エラー）です。</p><p><br>レスポンスのボディセクションは空でもかまいませんが、ほとんどの場合、本文セクションにHTMLドキュメントが入っています。これは、このシリーズで紹介する主要なHTTPレスポンスパターンです。</p><p><br><span style="font-weight:bold;">ウェブアプリは中間位置にある</span></p><p><br>リクエストと応答の間には、着信リクエストを解釈し、データベースから必要なデータを引き出し、あらかじめ定義されたビジネスルールに従って処理して、ユーザーのブラウザに表示されるHTMLドキュメントを含む応答を生成するのは、実際のウェブアプリであります。</p><p><br>&nbsp;フレームワークなしでゼロからWebアプリを実装することは可能ですが、最新のWebアプリのほとんどは、開発を容易にするRuby on Railsのようなフレームワークで構築されています。<br><br>このシリーズでは、Railsを使ってWebアプリケーションを構築する方法の詳細を学習します。</p>
]]>
</description>
<link>https://ameblo.jp/rubyspike/entry-12335249145.html</link>
<pubDate>Sun, 10 Dec 2017 14:44:18 +0900</pubDate>
</item>
<item>
<title>Railsの魔法を解明します（１）</title>
<description>
<![CDATA[ <h3 name="ddce"><strong>イントロダクション</strong></h3><p name="0d31">ウェブアプリ開発のフレームワークとして、ウェブアプリを構築する際に非常に役に立つでしょう。しかし、このことを成立する前提があります。それは、使用者はRailsを解決する問題をよく理解し、どうやって解決するかをきちんと分からなければなりません。</p><p name="0d31">&nbsp;</p><p name="7ce4">残念なことは、最も多いのガイドの内容は、どうして、それともどうやってRailsをするのかより、Railsをなにしたのかに集中しています。そのようなガイドは役に立つの場合は、開発者がやりたいことはガイドと全く一致するのみです。Railsを活用し、あらゆる課題を解決したいことはほぼ不可能でしょう。</p><p name="7ce4">&nbsp;</p><p name="9204">私はこのガイドを書く目的は、他のガイドと違って、Railsのできることを全て示すことがなく、その代わりに、Railsのないウェブアプリの世界への旅です。この旅を通じて、読者はなぜフレームワークが存在し、フレームワークなしでウェブアプリを開発する際の痛みを実感することができます。そうすると、Railsのコンベンションを学習する時、それらの背景と理由を既に理解したので、私たちは戸惑いことがないでしょう。</p><p name="9204">&nbsp;</p><p name="ddc6">話を短くすると、私は開発者がフレームワークを利用する前に、フレームワークなしでウェブ開発のことを理解すべきだと思います。</p><p name="ddc6">&nbsp;</p><p name="80a7">もしあなたはRailsに興味があり、あるいは試したことがあり、魔法だらけを感しているなら、このシリーズはおすすめです。同時に、このシリーズは復習のいい材料になるため、熟練者にとってもメリットがあると思います。</p><p name="80a7">&nbsp;</p><p name="6eb2">このシリーズを理解するの前置き知識は以下通りです。</p><p name="6eb2">&nbsp;</p><p name="b357">The Command Line<br>Ruby<br>OO Ruby<br>HTTP<br>SQL<br>Basic HTML</p><p name="b357">&nbsp;</p><p name="a79c">このシリーズの読み方：</p><p name="a79c">&nbsp;</p><p name="8cc3">内容は大きく二つ分けています。</p><p name="8cc3">&nbsp;</p><p name="afce">１Railsの魔法を解明する。</p><p name="f2f9">２Rails のコア コンベンションズ。</p><p name="f2f9">&nbsp;</p><p name="8da4">１の内容は、できるだけRailsのコンベンションを使用せず、シンプルなブログアプリを書くことを通してウェブアプリの基礎を直面し、Railsを軽減しようとする痛みを実感します。</p><p name="8da4">&nbsp;</p><p name="948d">後半は、私たちはRailsのコンベンションを利用して、もう一回ブログアプリを開発します。そうすると、前半が得られた知識の理解を一層に上がります。</p><p name="948d">&nbsp;</p><p name="3299">しかしもっと大切なことは、Railsはただの開発ツールではありません。そのコンベンションにより、ウェブアプリの組織構造と実行方法という考え方をウェブ開発者に提供しました。真のパワーは、フレームワークのメカニズムとその原因を良く理解し、ただ使用するではなく、開発者のリクエストに応じて適応することができます。</p><p name="3299">&nbsp;</p><p name="6995">このシリーズを読み終わった際、あなたがRailsの最も重要なコンベンションズを理解できます。しかしもっと肝心なのは、あなたがそれらは存在する理由と原因をわかりになっています。もしあなたはそのことも納得なら、このシリーズを読み続きしましょう。</p><p name="6995">&nbsp;</p><p name="6995">次のステップを踏む前に、HTTPのことについて少し復習します。&nbsp;</p>
]]>
</description>
<link>https://ameblo.jp/rubyspike/entry-12334790317.html</link>
<pubDate>Fri, 08 Dec 2017 18:51:32 +0900</pubDate>
</item>
<item>
<title>なぜプログラミング未経験者がフレームワークから学習するのはダメ？</title>
<description>
<![CDATA[ <p id="fcf4" name="fcf4">ソフトウェアエンジニアにとって仕事を通じて成長するのが一番早いと言われるけど、プログラミング未経験者にとって開発関連の仕事を獲得するのがほぼ不可能だと思う。</p><p id="fcf4" name="fcf4">&nbsp;</p><p id="a891" name="a891">やはりある程度の知識やスキルを身につけ、自分なりのポートフォリオを持った以上仕事を見つけることが可能になるでしょう。</p><p id="a891" name="a891">&nbsp;</p><p id="c4ba" name="c4ba">ここで、プログラミング未経験者にとって、ある程度の知識やスキルを身につけるため、一般的に二つの選択肢がある。一つは独学だ。私も最初はその道を選んだが、なかなか容易ではない。決して独学はだめというつもりはないけど、時間と効率のバランスから考えば、独学は一番良い方法と言えないと僕が思っている。</p><p id="c4ba" name="c4ba">&nbsp;</p><p id="4247" name="4247">なぜかというと、一番重要な問題は、独学のリソースは非システムマチクだ。どのトッピクは、どのぐらいまで把握する必要か？また、ある知識点を完全に理解するため、その前提として不可欠なコンセップトなどは、独学者にとって知るはずがないものだ。</p><p id="4247" name="4247">&nbsp;</p><p id="05c3" name="05c3">では、二番めの方法は、プログラミングbootcampに参加することだ。普通の場合、<strong>カリキュラム</strong>も体系化していて、プロジェクトに通じて実務経験も多少積んでることが可能だ。しかし、目的によるbootcampを選択する必要がある。そうしないと、大きな金と時間がルースしてしまう。</p><p id="05c3" name="05c3">&nbsp;</p><p id="9cbf" name="9cbf">もし、ただの仕事を見つけるためなら、適当なbootcampを選んで、未経験者が１ヶ月あるいは３ヶ月を通って、ソフトウェアエンジニアの仕事が見つけることが可能だ。少なくとも、こう宣伝するbootcampは結構ある。</p><p id="9cbf" name="9cbf">&nbsp;</p><p id="0f2f" name="0f2f">しかし、プログラミングを勉強するの目的は、ただの仕事を獲得ではなく、プロのエンジニアになりたい、何十年のもプロのエンジニアとして活躍するキャリアを目指している人にとって、そういうbootcampはあんまり役に立たないでしょう。</p><p id="0f2f" name="0f2f">&nbsp;</p><p id="d0e6" name="d0e6">なぜなら、それらのbootcampに教えられたのは、フレームワークが中心で、一見は実務に近いや生産力が短時間に飛躍などメリットがあるが、実は致命的なミスは起こした。未経験者にとって、学習するべきなのは、ソルーション（フレームワーク）ではなく、その問題を学習すべきである。単なるソルーションを学んで、そのソルーションを解決する問題はしっかり理解しないなら、もし問題が少し変わって、既存のソルーションをうまく解決できない場合は結構ある。パーフェクトなソルーションは存在しないから、エンジニアとして問題を解決する際、用いたソルーションのトレードオフをしっかり把握した以上、その問題を望む通りに解決できると言える。</p><p id="d0e6" name="d0e6">&nbsp;</p><p id="e8e2" name="e8e2">では、ウェブ開発において、プロのエンジニアになりたいあるいは何十年も活躍続けるキャリアが欲しいプログラミング未経験者にとって、ruby on rails，jquery、bootstapなどを最初から勉強せず、何を中心で勉強すべきか？</p><p id="e8e2" name="e8e2">&nbsp;</p><p id="0a32" name="0a32">僕の答えは、変わらないものを勉強すべきだ。フレームワークが変わる。新しい技術はどんどん出る。ですが、ウェブ開発の基礎はあまり変わらない。プログラミング基礎、関係型データベース、httpプロトコルなどはあんまり変わらない。フレームワークがレベル高い抽象だ。そのしたの基礎になるものをしっかり分からないなら、フレームワークを精通することがもちろん不可能だと思う。</p><p id="0a32" name="0a32">&nbsp;</p><p id="774b" name="774b">続きの話は僕の学習軌跡になるものだ。プログラミングの勉強を一年間を経ったので、ここで記録する。</p><p id="774b" name="774b">&nbsp;</p><p id="e2f3" name="e2f3">新卒で就活する際、文系の僕がウェブサービスを作りたいと決めて、内定先を辞退して、ウェブ開発を一心に勉強することになった。</p><p id="e2f3" name="e2f3">&nbsp;</p><p id="0cc5" name="0cc5">ウェブ開発（web application develop）と言えば、主な分野はフロントエンドとバックエンドになる。調べてみると、難易度がバックエンドの方が高い、バックエンドをクリアならフロントエンドもそこまで困難なことではないと考え、まずバックエンドから学習することが決定した。さらにバックエンドを分解し、その中でやはりプログラミング言語が大事だとわかり、MITとHarvardのオーペンコースを独学の教材として選定し、pythonとC言語をある程度触れることができました。この段階と言えば、まさにその学習のハニータイムと言えるでしょう。豊富な教材、新しい知識やスキルを身につける実感だ楽しくてたまらない。特に挫折もあったが、stackoverflowがあるおかけで、よくあった問題をほぼうまく解決した。これで２ヶ月経過した。</p><p id="0cc5" name="0cc5">&nbsp;</p><p id="2a50" name="2a50">MITとHarvardのコースが終わった後、優秀なエンジニアになるためコンピューターサイエンスの理論知識が不可欠だと考え、続きは情報系の必須科目に勉強を着手始めた。離散数学を始め、論理回路、データ構造とアルゴリズム、コンピューターアキーテクチャー、オプレーティングシステムも結構力に入れた。この段階では正直というと、死ぬほど辛いだ。情報系の理論の世界に入ると、文系の僕にとってはまさに地獄のような状況だ。</p><p id="2a50" name="2a50">&nbsp;</p><p id="2a50" name="2a50">しかし、F１のレーサーのように、車をうまく運転するため、車の性能やエンジンなどの知識が不可欠だと信じで、諦めずに３ヶ月で一通り目を通った。</p><p id="2a50" name="2a50">&nbsp;</p><p id="a0c0" name="a0c0">この時点で既にプログラミングを勉強してから半年に近いになる。PythonやC言語である程度のonline judgement問題をクリアすることだできた。情報系知識もある程度有している。これから本格的にウェブ開発の学習を始めようと思い、ruby on rails tutorialを勉強始めた。この本を通じてミニバージョンのツィーターが完成できるが、コードは完全にコペーペーのものだ。もちろん、このweb applicationもほぼ理解しておらず、新しい機能を追加しようとしてもできない。このことに気づいたのは、web developにおいて要する知識の範囲は非常に広いのことだ。バックエンドにおいてさらいにダータベース、オブジェクト指向、SQLなどの領域がある。これらの学習リソースはプログラミング基礎と違って、体系化したコースはあんまりなかった。どの知識が必要、どのぐらい理解が必要なのか全然分からない。この段階はいわば迷う時期でした。</p><p id="a0c0" name="a0c0">&nbsp;</p><p id="17e9" name="17e9">解決策としてbootcampを参加することに決めた。IT bootcampを選択する際、トッピク分割、<strong>カリキュラムの設計</strong>はもちろん重要だが、一番大切なのは、そのbootcampの教育哲学だと思う。</p><p id="17e9" name="17e9">&nbsp;</p><p id="7d15" name="7d15">そこで、あるオンラインブートキャンプに惹かれた。</p><p id="7d15" name="7d15">&nbsp;</p><p id="7d15" name="7d15">特徴としては主な三つがある。</p><p id="7d15" name="7d15">&nbsp;</p><p id="0f76" name="0f76">一つは、完全把握に基づき学習することだ。つまり、あるトッピクを完全に把握する以上、次のトッピクに進むことができる。なぜこういう当たり前のことが大切だというと、もしトッピクA，B両方の習得度が８０％とする、トッピクABの学習度が６４％になってしまうだ。伝統的な教育システムと違って、学習のペースはスゲジュール通りではない。全ての人は学校にこういう経験があると思う：昨日の数学知識がまだ完全に理解していないのに、今日は先生が次のトッピクに進んでしまう。伝統的な教育システムと違って、このbootcampでは、例えばプログラミング基礎を完全に把握しないなら、オベジェクト指向のトピックへ進めないだ。このことを実現するため、審査という仕組みがある。つまり、学習ステージことに審査がある。紙面のテストとSKYPEやCLOUD9を利用して問題を回答しながらコーディングする必要から、コーディング能力だけでなく、コミュニケーション能力も不可欠だ。また、ここのインストラクターはシリコンバレー出身で、英語の会話力もトレーニングできる。</p><p id="0f76" name="0f76">&nbsp;</p><p id="f9b9" name="f9b9">二つの特徴は、基礎重視、変わらないものを中心に教えられた。ruby on railsのことを勉強するために、最低でも６００時間の前置コースを完了する条件がある（もちろん審査がる）。その中で、プログラミング基礎、オベジェクト指向、SQL、HTTPなどの知識を中心に、体系的に教えられる。</p><p id="f9b9" name="f9b9">&nbsp;</p><p id="b401" name="b401">三つの特徴は、大量な練習と繰り返す学習哲学だ。音楽家のように、完璧な演出するため、一般人が想像も尽きない練習時間を費やした。プログラミングの習得も似たようなものだ。また、あるトッピクに対して、ただ一回だけ学習するではなく、なんども復習する必要がある。なぜかというと、長期的な記憶形成には、重複しか方法がない。</p><p id="2bfc" name="2bfc">このbootcampでは、明らかに不向きな人がいる。それは、短時間で仕事を獲得したい人だ。プログラミング未経験者の場合、１日学習時間が１０時間とすると、全てのコースを完成するため約半年が必要だ。通常の場合、卒業するため一年間以上の時間がかかる。</p><p id="2bfc" name="2bfc">&nbsp;</p><p id="c9c2" name="c9c2">僕は１０月に参加し、今日までも半年になった。毎日の学習時間は平均６時間ぐらい、まだカリキュラムの半分に達しないが、基礎だけはしっかり勉強したという実感がある。ruby言語、SQL、HTTP、HTML、CSSなどに費やしたの何百時間が絶対に無駄ではないと信じている。</p><p id="c9c2" name="c9c2">&nbsp;</p><p id="b343" name="b343">未経験の学習者にとって、これはThe Slow Path To Proficiency.</p><p id="b343" name="b343"><a href="https://stat.ameba.jp/user_images/20170419/20/rubyspike/ee/d0/p/o0884184213917722635.png"><img alt="" height="875" src="https://stat.ameba.jp/user_images/20170419/20/rubyspike/ee/d0/p/o0884184213917722635.png" width="420"></a></p>
]]>
</description>
<link>https://ameblo.jp/rubyspike/entry-12267129963.html</link>
<pubDate>Wed, 19 Apr 2017 20:15:27 +0900</pubDate>
</item>
</channel>
</rss>
