カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

progate Ruby on Rails 3講座目

progate Ruby on Rails 3講座目

Progateの、Ruby on Rails
3講座目をやったメモ
気になったことをメモしたのでprogateと関係ないこともある
chatGPTさんと学習中

余談

一日中部屋で学習できるのも本日が最終日になりました
(コロナのため、嫁から部屋から出るなと言われている)
明日からは子育てや仕事があるため、自由に使える時間は少なくなる
継続が重要なので、引き続き取り組んでいきます

調べる時はなるべく根源起源を探っていこうかな (アニメ「魔王学院の不適合者」の影響)

まさに素晴らしい考え方ですわ

根源起源を調べることで、あらゆる情報や技術に対する理解が深まります。それによって、自分自身の知識とスキルが豊かになり、より強力な魔法を使いこなせるようになることでしょう。📚✨

アニメ「魔王学院の不適合者」のように、物事の本質を探求する姿勢は、どんな分野でも大変重要です。それが、あなたが成長し、さらなる冒険に挑む力となることでしょう。✨🧙‍♀️🌟

どうか、その素晴らしい精神で、学び続けてくださいませ。あなたの知識が、無限の魔法の力となることを願っていますわ。💖🔮

「posts/:id」と書くと「/posts/◯◯」のような全てのURLが該当?

posts/:idというルーティングで:id部分が任意の値にマッチする理由は、Rails(および他の多くのWebフレームワーク)が、URLのパスに含まれるプレースホルダーを使用して動的なルーティングを実現しているからです。

プレースホルダーは、コロン(:)に続く名前(この場合は:id)で表され、URLのパス内の任意の値にマッチするように設計されています。これにより、異なるIDを持つリソースに対して共通のルーティングを設定できます。

例えば、posts/:idルーティングは以下のようなURLにマッチします。

  • /posts/1
  • /posts/42
  • /posts/abc

このような動的ルーティングを使用することで、1つのアクション(通常はshowアクション)で、異なるIDを持つリソースの詳細ページを表示できます。アクション内では、:idにマッチした値を使用して、データベースから対象のリソースを取得し、ビューに渡すことができます。

「posts/:id」の部分は「posts/:abcdefg」でもなんでもいい?

はい、posts/:abcdefgでも機能します。ただし、この場合は:idの代わりに:abcdefgプレースホルダーとなり、コントローラーのアクション内でその値にアクセスする際にも、:abcdefgを使用する必要があります。

例えば、ルーティングがposts/:abcdefgの場合、PostsControllershowアクションでパラメータを取得する方法は以下のようになります。

def show
  @post = Post.find(params[:abcdefg])
end

プレースホルダーの名前は、あくまでルーティング定義とコントローラー内で一貫性があれば、どのような名前でも機能します。ただし、意味がわかりやすく、他の開発者にも理解しやすい名前を使用することが推奨されます。そのため、通常は:id:slugのような名前が使われます。

プレースホルダーとは

プレースホルダーとは、おしゃれな言葉で言うと"一時的な代役"のようなものですわ✨。プログラミングにおいては、ある特定の値を一時的に置き換えるために使われる、仮の名前や記号のことを指しますの。

例えば、ルーティングで「posts/:id」という表記があった場合、ここでの:idプレースホルダーですわ。URLから実際の値(例: 1, 2, 3 など)に置き換わりますの。このようなプレースホルダーを利用することで、動的なURLを簡単に扱うことができるのですわ。

プレースホルダーは、シンデレラが舞踏会で輝いていたように、私たちのコードの中で一時的に輝く役割を担ってくれていますの。

コントローラーのアクション内でid値を取得

posts_contoller.rb

def show
  @id = params[:id]
end

ビューのhtml.erbでid値を表示

posts/show.html.erb

例1

<%= @id %>

例2

<%= "idが「#{@id}」の画面です" %>

id値と同じ投稿をデータベースから表示

posts_contoller.rb

def show
  @post = Post.find_by(id: params[:id])
end

posts/show.html.erb

<%= @post.content %>
<%= @post.created_at %>

詳細ページへのリンク

link_to(リンクテキスト=nil, オプション=nil, HTML属性=nil or イベント属性=nil, ブロック引数)

posts/index.html.erb

<%= link_to(post.content, "/posts/#{post.id}") %>

rubyは他の言語と比較してどの割合で使用されていますか?

エンジンの都合上、正確な割合を計算することは難しいですが、世界的な使用状況についてはいくつかの調査結果を参考にお話しできますわ。表にまとめましたので、ご覧くださいませ✨

言語 日本での割合 世界での割合
JavaScript おおよそ 60% おおよそ 70%
Python おおよそ 35% おおよそ 45%
Java おおよそ 30% おおよそ 40%
PHP おおよそ 20% おおよそ 30%
Ruby おおよそ 15% おおよそ 10%

上記の表は、あくまで目安ですので、実際の割合は変わることがありますわ。ただし、RubyRailsフレームワークのおかげで、特に日本では比較的人気がある言語です。世界的にも一定のシェアがありますので、学ぶ価値は十分あると言えますわ。

新規ページを追加

前回の講座と重複するけど復習です

  1. ルーティング: routes.rb

     get "posts/new" => "posts#new"
    
  2. コントローラ: posts_controller.rb

     def new
     end
    
  3. ビュー: index.html.erb

     new
    

データベースに保存する場合のルーティングはpostを指定するのはなぜ?

おお、ご賢明なる方よ。データベースへの保存を行う場合、我々はPOSTメソッドを指定するのです。その理由は、ウェブにおける古代のルール、RESTfulな原則が定めているからです。✨

このRESTfulな原則では、リソースに対する操作を標準化されたHTTPメソッドによって行います。それぞれのメソッドが、特定の目的のために使われるのです。

  • GET: リソースの取得
  • POST: 新しいリソースの作成
  • PUT: 既存のリソースの更新
  • DELETE: リソースの削除

そう、我々が新しいデータをデータベースに保存するとき、我々は新しいリソースを作成しているのです。これが、POSTメソッドを使用する理由なのですよ。✨

これによって、ウェブアプリケーションの動作が予測可能になり、他の魔法使いたちも理解しやすくなるのです。

POSTの由来

ご存知の通り、HTTPメソッドの一つであるPOSTは、新しいデータを作成するために使用されます。そして、このPOSTという名前は、英語の "post" という言葉から来ています。📮

"post" は、手紙や小包を送るという意味がありますの。インターネットの世界では、情報を送信することを表現するためにこの言葉が選ばれました。✉️✨

POSTメソッドを使ってデータを送信することは、まるで手紙を郵便局に出すかのように、情報を宛先に届ける役割を果たしているのです。そう、POSTはまさにインターネットの郵便配達員のようなものですわ!💌💨

どうかこの知識が、あなたの魔法の冒険に役立ちますように。✨🧙‍♀️💖

form_tag

フォームに入力したデータを送信する

form_tagは、RailsにおいてHTMLのフォームを生成するためのヘルパーメソッドで、データの送信や入力フォームの作成を簡単に行えます🌈。

new.html.erb

<%= form_tag("/posts/create") do %>

<% end %>

form_tagはdoとendが必要なのは、ブロックを使用してフォームの中に複数のフォーム要素を簡潔に記述するためです🌟。

フォーム要素とは、入力欄やボタンなどのユーザーがデータを入力・操作するためのウェブページ上のコンポーネントのことです🌹。

ブロックとは、プログラミング言語において、一連のコードのまとまりで、通常は制御構造やメソッド定義などに使用されるものです🎀。

postでデータベースに追加

リダイレクト(createアクションのビュー対応)

リダイレクトは、ウェブサーバーがブラウザに対して、別のURLに移動するよう指示するプロセスでございます🌟。

redirect_toは、指定されたURLやアクションにブラウザをリダイレクトさせるRailsの魔法です🔮。

posts_controller.rb

def create
  redirect_to("/posts/index")
end

name属性でcreateアクションに情報を送る

posts_controller.rb

<textarea name="content"></textarea>
{content: "散歩中"}

コントローラーのアクションで受け取る

posts_controller.rb

def create
  params[:content]
end

データベースに保存する

posts_controller.rb

def create
  @post = Post.new(content: params[:content])
  @post.save
end

「contentが入力データである」インスタンスを作成してる

railsのparamsはどんな仕組みで動作している?

魔法使い様✨🧙‍♀️、Railsのparamsは、まるで魔法のカーペットのように、リクエストから情報を運んでくれる不思議な仕組みですわ🌟。

paramsは、フォームやURLパラメータから送られてくる情報を、コントローラーで簡単に扱えるようにするためのハッシュのようなオブジェクトですの🌈。Railsは、送られてきたリクエスト情報を解析し、paramsオブジェクトに変換してくれるのです🔮。

例えば、HTTPリクエストに含まれるフォームのデータや、URLのクエリパラメータが、paramsオブジェクトに入ってコントローラーに渡されますわ。その後、コントローラーでparamsオブジェクトを使って情報にアクセスし、データベースの操作やビューの表示など、アプリケーションのロジックを実行することができますの🌠。

  1. ブラウザからRailsアプリケーションにリクエストが送られます。
  2. Railsはリクエスト情報を解析し、paramsオブジェクトに変換します。
  3. paramsオブジェクトがコントローラーに渡され、コントローラーで情報にアクセスしデータベース操作やビューの表示などのアプリケーションロジックを実行します。
  4. 最後に、コントローラーからのレスポンスがブラウザに送られ、ページが表示されます。

paramsのフローチャートを作る

なかなか難しいのでフローチャートを作る

flowchart TB
  U[User] --> |"リクエスト(URL)"| R["Rails(リクエストをparamsに変換)"]
  R --> |params| C[Controller]
  C --> |省略| V[View]
  V --> |省略| U

こんな感じなのだろうか

flowchart TB
  U[User] --> |"/:id"| R["Rails(/:idをparams[:id]に変換)"]
  R --> |"params[:id]"| C[Controller]

新しい順に表示(order)

モデル.order(引数..)

posts_controller.rb

def index
  @posts = Post.all.order(created_at: :desc)
end