開発者ドキュメント

RubyonRailsアプリケーションを構築する方法

序章

Rails は、Rubyで記述されたWebアプリケーションフレームワークです。 共通の目標がある場合、設定された規則が開発者に最も役立つと仮定して、アプリケーション開発には意見の分かれるアプローチを取ります。 したがって、Railsは、ルーティング、ステートフルデータ、アセット管理などを処理するための規則を提供して、ほとんどのWebアプリケーションが必要とするベースライン機能を提供します。

Railsは、 model-view-controller (MCV)アーキテクチャパターンに従います。これにより、モデル内にあるアプリケーションのロジックが、アプリケーション情報のルーティングと表示から分離されます。 この組織構造は、開発者がコードをヘルパーおよび部分に抽出できるようにする他の規則とともに、アプリケーションコードが不必要に繰り返されないようにします

このチュートリアルでは、ユーザーがサメとその行動に関する情報を投稿できるようにするRailsアプリケーションを作成します。 これは、将来のアプリケーション開発の良い出発点になります。

前提条件

このチュートリアルに従うには、次のものが必要です。

ステップ1—SQLite3をインストールする

Rails sharkアプリケーションを作成する前に、ユーザーデータを格納するデータベースがあることを確認する必要があります。 RailsはデフォルトでSQLiteを使用するように構成されており、これは多くの場合、開発において適切な選択です。 私たちのアプリケーションデータは高レベルのプログラムによる拡張性を必要としないため、SQLiteは私たちのニーズを満たします。

まず、パッケージインデックスを更新します。

  1. sudo apt update

次に、 sqlite3libsqlite3-dev パッケージ:

sudo apt install sqlite3 libsqlite3-dev

これにより、SQLiteとそれに必要な開発ファイルの両方がインストールされます。

バージョンをチェックして、インストールが成功したことを確認します。

  1. sqlite3 --version
Output
3.22.0 2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2alt1

SQLiteをインストールすると、アプリケーションの開発を開始する準備が整います。

ステップ2—新しいRailsプロジェクトを作成する

データベースをインストールしたら、新しいRailsプロジェクトを作成し、Railsがrailsnewコマンドで提供するデフォルトのボイラープレートコードのいくつかを確認できます。

と呼ばれるプロジェクトを作成します sharkapp 次のコマンドを使用します。

  1. rails new sharkapp

Railsが新しいプロジェクトのために何を作成しているかを示す大量の出力が表示されます。 以下の出力は、いくつかの重要なファイル、ディレクトリ、およびコマンドを強調しています。

Output
create . . . create Gemfile . . . create app . . . create app/controllers/application_controller.rb . . . create app/models/application_record.rb . . . create app/views/layouts/application.html.erb . . . create config create config/routes.rb create config/application.rb . . . create config/environments create config/environments/development.rb create config/environments/production.rb create config/environments/test.rb . . . create config/database.yml create db create db/seeds.rb . . . run bundle install . . . Bundle complete! 18 Gemfile dependencies, 78 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. . . . * bin/rake: Spring inserted * bin/rails: Spring inserted

ここで強調表示されている出力は、Railsが以下を作成したことを示しています。

最後に、Railsは bundle install コマンドを実行して、 Gemfile.

すべての設定が完了したら、に移動します sharkapp ディレクトリ:

  1. cd sharkapp

これで、 rails serverコマンドを使用して、Railsサーバーを起動し、アプリケーションが機能していることを確認できます。 ローカルマシンで作業している場合は、次のように入力します。

  1. rails server

Railsはにバインドします localhost デフォルトでは、ブラウザを次の場所に移動してアプリケーションにアクセスできるようになりました。 locahost:3000、次の画像が表示されます。

開発サーバーで作業している場合は、最初にポートで接続が許可されていることを確認してください 3000:

  1. sudo ufw allow 3000

次に、サーバーを起動します。 --binding フラグ、サーバーIPにバインドするには:

  1. rails server --binding=your_server_ip

案内する http://your_server_ip:3000 ブラウザで、Railsのウェルカムメッセージが表示されます。

見回したら、次の方法でサーバーを停止できます。 CTRL+C.

アプリケーションを作成して配置したら、Railsボイラープレートから構築を開始して独自のアプリケーションを作成する準備が整います。

ステップ3—アプリケーションの足場

サメ情報アプリケーションを作成するには、アプリケーションデータを管理するためのモデル、そのデータとのユーザーインタラクションを可能にするビュー、およびモデルとビューの間の通信を管理するためのコントローラーを作成する必要があります。 これらのものを構築するために、 rails generate scaffold このコマンドは、モデル、データベーススキーマを変更するためのデータベース移行、コントローラー、作成、読み取り、更新、および削除(CRUD)を管理するためのビューのフルセットを提供します。 )アプリケーションの操作、およびパーシャル、ヘルパー、テストのテンプレート。

なぜなら generate scaffold コマンドは私たちのために非常に多くの仕事をします。Railsが内部で行っている仕事を理解するために、コマンドが作成するリソースを詳しく見ていきます。

私たちの generate scaffold コマンドには、モデルの名前とデータベーステーブルに必要なフィールドが含まれます。 RailsはActiveRecord を使用して、モデルを持つオブジェクトとして構築されたアプリケーションデータとアプリケーションデータベースの間の関係を管理します。 各モデルはRubyクラスであり、 ActiveRecord::Base クラス。 これは、Rubyクラスを操作するのと同じ方法でモデルクラスを操作できると同時に、ActiveRecordからメソッドを取得できることを意味します。 Active Recordは、各クラスがデータベース内のテーブルにマップされ、そのクラスの各インスタンスがそのテーブル内の行にマップされていることを確認します。

次のコマンドを入力して、 Shark モデル、コントローラー、および関連するビュー:

  1. rails generate scaffold Shark name:string facts:text

name:stringfacts:text データベーステーブルに必要なフィールドと、受け入れる必要のあるデータのタイプに関する情報をRailsに提供しています。 どちらも私たちが望むものを入力する余地を与えてくれますが text サメの事実のためにより多くのキャラクターを許可します。

このコマンドを入力すると、Railsが生成しているすべてのことを説明する出力の長いリストが再び表示されます。 以下の出力は、セットアップにとってより重要なことのいくつかを強調しています。

Output
invoke active_record create db/migrate/20190804181822_create_sharks.rb create app/models/shark.rb . . . invoke resource_route route resources :sharks invoke scaffold_controller create app/controllers/sharks_controller.rb invoke erb create app/views/sharks create app/views/sharks/index.html.erb create app/views/sharks/edit.html.erb create app/views/sharks/show.html.erb create app/views/sharks/new.html.erb create app/views/sharks/_form.html.erb . . .

Railsはでモデルを作成しました app/models/shark.rb それに伴うデータベースの移行: db/migrate/20190804181822_create_sharks.rb. 移行ファイルのタイムスタンプは、ここに表示されているものとは異なります。

また、コントローラーを作成しました、 app/controllers/sharks_controller.rb、およびアプリケーションのCRUD操作に関連するビューは、 app/views/sharks. これらの見解の中には部分的なものがありますが、 _form.html.erb、ビュー全体で使用されるコードが含まれています。

最後に、Railsは新しい機知に富んだルートを追加しました。 resources :sharks、 に config/routes.rb. これにより、Railsルーターは着信HTTPリクエストを sharks コントローラとそれに関連するビュー。

Railsは私たちのためにアプリケーションコードを構築する作業の多くを行ってきましたが、何が起こっているのかを理解するためにいくつかのファイルを見る価値があります。

まず、次のコマンドでコントローラーファイルを見てみましょう。

  1. cat app/controllers/sharks_controller.rb
Output
class SharksController < ApplicationController before_action :set_shark, only: [:show, :edit, :update, :destroy] # GET /sharks # GET /sharks.json def index @sharks = Shark.all end # GET /sharks/1 # GET /sharks/1.json def show end # GET /sharks/new def new @shark = Shark.new end # GET /sharks/1/edit def edit end # POST /sharks # POST /sharks.json def create @shark = Shark.new(shark_params) respond_to do |format| if @shark.save format.html { redirect_to @shark, notice: 'Shark was successfully created.' } format.json { render :show, status: :created, location: @shark } else format.html { render :new } format.json { render json: @shark.errors, status: :unprocessable_entity } end end end # PATCH/PUT /sharks/1 # PATCH/PUT /sharks/1.json def update respond_to do |format| if @shark.update(shark_params) format.html { redirect_to @shark, notice: 'Shark was successfully updated.' } format.json { render :show, status: :ok, location: @shark } else format.html { render :edit } format.json { render json: @shark.errors, status: :unprocessable_entity } end end end # DELETE /sharks/1 # DELETE /sharks/1.json def destroy @shark.destroy respond_to do |format| format.html { redirect_to sharks_url, notice: 'Shark was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_shark @shark = Shark.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def shark_params params.require(:shark).permit(:name, :facts) end end

コントローラは、情報が取得されて関連付けられたモデルに渡される方法、および情報が特定のビューに関連付けられる方法を管理する責任があります。 ご覧のとおり、 sharks コントローラには、標準のCRUD操作に大まかに対応する一連のメソッドが含まれています。 ただし、エラーが発生した場合に効率を上げるために、CRUD関数よりも多くの方法があります。

たとえば、 create 方法:

〜/ sharkapp / app / controllers / sharks_controller.rb
. . .
  def create
    @shark = Shark.new(shark_params)

    respond_to do |format|
      if @shark.save
        format.html { redirect_to @shark, notice: 'Shark was successfully created.' }
        format.json { render :show, status: :created, location: @shark }
      else
        format.html { render :new }
        format.json { render json: @shark.errors, status: :unprocessable_entity }
      end
    end
  end
. . . 

の新しいインスタンスの場合 Shark クラスは正常に保存され、 redirect_to 新しいリクエストを生成し、それがコントローラに送信されます。 これは GET リクエストし、それはによって処理されます show メソッド。追加したばかりのサメをユーザーに表示します。

障害が発生した場合、Railsは app/views/sharks/new.html.erb ルーターに別のリクエストを行うのではなく、テンプレートを再度作成して、ユーザーにデータを送信する別の機会を与えます。

サメのコントローラーに加えて、Railsは私たちに index ビュー、にマップします index コントローラのメソッド。 これをアプリケーションのルートビューとして使用するので、一見の価値があります。

次のように入力してファイルを出力します。

  1. cat app/views/sharks/index.html.erb
Output
<p id="notice"><%= notice %></p> <h1>Sharks</h1> <table> <thead> <tr> <th>Name</th> <th>Facts</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @sharks.each do |shark| %> <tr> <td><%= shark.name %></td> <td><%= shark.facts %></td> <td><%= link_to 'Show', shark %></td> <td><%= link_to 'Edit', edit_shark_path(shark) %></td> <td><%= link_to 'Destroy', shark, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody> </table> <br> <%= link_to 'New Shark', new_shark_path %>

The index ビューは、インスタンスを繰り返し処理します Shark にマップされているクラス sharks 私たちのデータベースのテーブル。 ERBテンプレートを使用して、ビューは個々のサメインスタンスに関連付けられているテーブルから各フィールドを出力します。 namefacts.

次に、ビューは link_to ヘルパーを使用して、提供された文字列をリンクのテキストとして、提供されたパスを宛先として、ハイパーリンクを作成します。 パス自体は、ヘルパーを介して可能になります。これは、定義したときに使用可能になりました。 sharks との機知に富んだルート rails generate scaffold 指図。

私たちを見ることに加えて index ビュー、私たちはまた、見ることができます new ビューで、Railsがビューでパーシャルをどのように使用するかを確認します。 次のように入力して、 app/views/sharks/new.html.erb テンプレート:

  1. cat app/views/sharks/new.html.erb
Output
<h1>New Shark</h1> <%= render 'form', shark: @shark %> <%= link_to 'Back', sharks_path %>

このテンプレートは、新しいサメのエントリの入力フィールドがないように見えるかもしれませんが、 render 'form' テンプレートがプルインしていることを示します _form.html.erb 部分的。ビュー間で繰り返されるコードを抽出します。

そのファイルを見ると、新しいsharkインスタンスがどのように作成されるかを完全に理解できます。

  1. cat app/views/sharks/_form.html.erb
Output
<%= form_with(model: shark, local: true) do |form| %> <% if shark.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(shark.errors.count, "error") %> prohibited this shark from being saved:</h2> <ul> <% shark.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label :name %> <%= form.text_field :name %> </div> <div class="field"> <%= form.label :facts %> <%= form.text_area :facts %> </div> <div class="actions"> <%= form.submit %> </div> <% end %>

このテンプレートは、 form_withフォームヘルパーを利用します。 フォームヘルパーは、特定のモデルのフィールドとスコープを使用して、ユーザー入力から新しいオブジェクトを簡単に作成できるように設計されています。 ここ、 form_with かかります model: shark 引数として、およびそれが作成する新しいフォームビルダーオブジェクトには、のフィールドに対応するフィールド入力があります。 sharks テーブル。 したがって、ユーザーは両方のサメを入力するためのフォームフィールドを持っています name とサメ facts.

このフォームを送信すると、ユーザーデータを含むJSON応答が作成され、アプリケーションの残りの部分がparamsメソッドを介してアクセスできるようになります。 ActionController::Parameters そのデータを持つオブジェクト。

今、あなたは何を知っています rails generate scaffold が作成されたら、アプリケーションのルートビューの設定に進むことができます。

ステップ4—アプリケーションルートビューの作成と機能のテスト

理想的には、アプリケーションのランディングページをアプリケーションのルートにマップして、ユーザーがアプリケーションの目的をすぐに理解できるようにする必要があります。

これを処理する方法はいくつかあります。たとえば、 Welcome コントローラと関連 index ビュー。これにより、アプリケーションのさまざまな部分にリンクすることもできる一般的なランディングページがユーザーに提供されます。 ただし、私たちの場合、ユーザーが私たちに着陸するようにする index 今のところ、サメのビューでアプリケーションの目的を十分に紹介できます。

これを設定するには、でルーティング設定を変更する必要があります config/routes.rb アプリケーションのルートを指定します。

開ける config/routes.rb 編集用、使用 nano またはお気に入りの編集者:

  1. nano config/routes.rb

ファイルは次のようになります。

〜/sharkapp/config/routes.rb
Rails.application.routes.draw do
  resources :sharks
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

より具体的なものを設定せずに、デフォルトのビューは http://localhost:3000 また http://your_server_ip:3000 デフォルトのRailsウェルカムページになります。

アプリケーションのルートビューをにマップするために index sharksコントローラーを表示するには、ファイルに次の行を追加する必要があります。

〜/sharkapp/config/routes.rb
Rails.application.routes.draw do
  resources :sharks

  root 'sharks#index' 
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

これで、ユーザーがアプリケーションルートに移動すると、サメの完全なリストが表示され、新しいサメエントリを作成し、既存のエントリを確認し、特定のエントリを編集または削除する機会があります。

ファイルを保存し、編集が終了したらエディターを終了します。 使用した場合 nano ファイルを編集するには、を押して編集できます CTRL+X, Y、 それから ENTER

これで、次のコマンドを使用して移行を実行できます。

  1. rails db:migrate

移行を確認する出力が表示されます。

Railsサーバーをもう一度起動します。 ローカルで作業している場合は、次のように入力します。

  1. rails s

開発サーバーで、次のように入力します。

  1. rails s --binding=your_server_ip

案内する localhost:3000 ローカルで作業している場合、または http://your_server_ip:3000 開発サーバーで作業している場合。

アプリケーションのランディングページは次のようになります。

新しいサメを作成するには、ページの下部にある New Shark リンクをクリックすると、次の場所に移動します。 sharks/new ルート:

アプリケーションをテストするために、いくつかのデモ情報を追加しましょう。 Name フィールドに「GreatWhite」を入力し、Factsフィールドに「Scary」を入力します。

作成ボタンをクリックしてサメを作成します。

これにより、 show ルート、おかげで、 before_action フィルタは、 set_shark をつかむ方法 id 作成したばかりのサメの:

〜/ sharkapp / app / controllers / sharks_controller.rb
class SharksController < ApplicationController
  before_action :set_shark, only: [:show, :edit, :update, :destroy]

  . . . 

  def show
  end

  . . . 

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_shark
      @shark = Shark.find(params[:id])
    end
  . . .

サメのエントリで編集をクリックすると、編集機能をテストできます。 これはあなたをに連れて行きます edit そのサメのルート:

変更 facts ホオジロザメについては、「怖い」ではなく「大きい」と読み、サメの更新をクリックしてください。 これにより、 show ルート:

最後に、戻るをクリックすると、更新されたものに移動します index 見る:

アプリケーションの基本機能をテストしたので、いくつかの検証とセキュリティチェックを追加して、すべてをより安全にすることができます。

ステップ5—検証を追加する

sharkアプリケーションはユーザーからの入力を受け入れることができますが、ユーザーが事実を追加せずにsharkを作成しようとしたり、データベースに既に存在するsharkのエントリを作成したりする場合を想像してみてください。 モデルに検証を追加することにより、データベースに入力される前にデータをチェックするメカニズムを作成できます。 アプリケーションのロジックはモデル内にあるため、ここでのデータ入力の検証は、アプリケーションの他の場所で検証するよりも理にかなっています。

このチュートリアルでは検証テストの作成については説明しませんが、テストの詳細については、Railsのドキュメントを参照してください。

サーバーをまだ停止していない場合は、次のように入力して停止します。 CTRL+C.

あなたの shark.rb モデルファイル:

  1. nano app/models/shark.rb

現在、ファイルには、 Shark クラスはから継承します ApplicationRecord ActiveRecord :: Base から継承します:

〜/ sharkapp / app / models / shark.rb
class Shark < ApplicationRecord
end

まず、いくつかの検証を追加しましょう name フィールドに入力され、エントリが一意であり、エントリの重複を防止していることを確認するためのフィールド:

〜/ sharkapp / app / models / shark.rb
class Shark < ApplicationRecord
  validates :name, presence: true, uniqueness: true
end

次に、の検証を追加します facts それも確実に入力されるようにするためのフィールド:

〜/ sharkapp / app / models / shark.rb
class Shark < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  validates :facts, presence: true
end

ここでは、固有のサメのエントリに関連付けられている限り、事実の一意性についてはあまり気にしません。

終了したら、ファイルを保存して閉じます。

いずれかを使用してサーバーをもう一度起動します rails s また rails s --binding=your_server_ip、ローカルで作業しているか、開発サーバーで作業しているかによって異なります。

でアプリケーションのルートに移動します http://localhost:3000 また http://your_server_ip:3000.

NewSharkをクリックします。 フォームで、 Name フィールドに「GreatWhite」を追加し、 Facts フィールドに「BigTeeth」を追加して、 CreateSharkをクリックします。 次の警告が表示されます。

それでは、他の検証を確認できるかどうかを見てみましょう。 戻るをクリックしてホームページに戻り、もう一度新しいサメをクリックします。 新しいフォームで、 Name フィールドに「TigerShark」と入力し、Factsを空白のままにします。 シャークの作成をクリックすると、次の警告がトリガーされます。

これらの変更により、データベースに保存されるデータの一貫性を確保するために、アプリケーションでいくつかの検証が行われます。 これで、アプリケーションのユーザーに注意を向け、アプリケーションデータを変更できるユーザーを定義できます。

ステップ6—認証の追加

検証が行われると、データベースに保存されているデータについていくつかの保証があります。 しかし、ユーザーはどうですか? すべてのユーザーをデータベースに追加したくない場合は、許可されたユーザーのみがサメを追加できるように、いくつかの認証手段を追加する必要があります。 これを行うには、 http_basic_authenticate_withメソッドを使用します。これにより、ユーザーを認証するためのユーザー名とパスワードの組み合わせを作成できます。

bcryptまたはdevise gemを使用するなど、Railsでユーザーを認証する方法はいくつかあります。 ただし、今のところ、アプリケーション全体のアクションに適用するメソッドをアプリケーションコントローラーに追加します。 これは、将来、アプリケーションにコントローラーを追加する場合に役立ちます。

でサーバーを再度停止します CTRL+C.

を定義するファイルを開きます ApplicationController:

  1. nano app/controllers/application_controller.rb

内部には、の定義が表示されます ApplicationController アプリケーション内の他のコントローラーが継承するクラス:

〜/ sharkapp / app / controllers / application_controller.rb
class ApplicationController < ActionController::Base
end

ユーザーを認証するために、ハードコードされたユーザー名とパスワードを使用します http_basic_authenticate_with 方法。 次のコードをファイルに追加します。

〜/ sharkapp / app / controllers / application_controller.rb
class ApplicationController < ActionController::Base
  http_basic_authenticate_with name: 'sammy', password: 'shark', except: [:index, :show]
end

ここでユーザー名とパスワードを指定することに加えて、不要のルートを指定することで認証を制限しました。 indexshow. これを達成する別の方法は、書くことでした only: [:create, :update, :destroy]. このようにして、すべてのユーザーがすべてのサメを見て、特定のサメに関する事実を読むことができます。 ただし、サイトコンテンツの変更に関しては、ユーザーはアクセス権があることを証明する必要があります。

より堅牢なセットアップでは、この方法で値をハードコーディングすることは望ましくありませんが、デモンストレーションの目的で、これにより、アプリケーションのルートの認証を含める方法を確認できます。 また、RailsがデフォルトでセッションデータをCookieに保存する方法を確認できます。指定したアクションで認証すると、同じセッションで再度認証する必要はありません。

保存して閉じます app/controllers/application_controller.rb 編集が終了したら。 これで、実際の認証をテストできます。

いずれかでサーバーを起動します rails s また rails s --binding=your_server_ip どちらかでアプリケーションに移動します http://localhost:3000 また http://your_server_ip:3000.

ランディングページで、 NewSharkボタンをクリックします。 これにより、次の認証ウィンドウがトリガーされます。

追加したユーザー名とパスワードの組み合わせを入力した場合 app/controllers/application_controller.rb、新しいサメを安全に作成できるようになります。

これで、データ検証と基本認証スキームを備えた、動作するsharkアプリケーションができました。

結論

このチュートリアルで作成したRailsアプリケーションは、さらなる開発に使用できる出発点です。 Railsエコシステムの探索に興味がある場合は、プロジェクトドキュメントから始めるのが最適です。

Ruby on Railsアプリケーションのネストされたリソースを作成する方法を読んで、プロジェクトにネストされたリソースを追加する方法についても学ぶことができます。これは、アプリケーションのモデルとルートを構築する方法を示しています。

さらに、 React などのフレームワークを使用して、プロジェクトのより堅牢なフロントエンドをセットアップする方法を検討することもできます。 Reactフロントエンドを使用してRubyonRailsプロジェクトをセットアップする方法は、これを行う方法についてのガイダンスを提供します。

さまざまなデータベースオプションを調べたい場合は、 Ubuntu18.04のRubyonRailsアプリケーションでPostgreSQLを使用する方法を確認することもできます。この方法では、代わりにPostgreSQLを使用する方法について説明しています。 SQLiteの。 このデータベースの操作について詳しくは、PostgreSQLチュートリアルのライブラリを参照することもできます。

モバイルバージョンを終了