rosh-1228のメモ

自身の勉強したことをメモしてます。

scaffoldについて復習

Railsについて勉強したので復習のために書いていく。

scaffold

Railsドキュメントによると、以下のように記述がある。

アプリケーションの基本的な機能の一覧(index)、詳細(show)、新規作成(new/create)、編集(edit/update)、削除(destroy)するために必要なコントローラ、モデル、ビューをまとめて生成

基本的な機能としてCRUD機能を自動で作成してくれる機能みたい。

CRUD機能を持つアプリを作成したい時は、scaffoldを使うと便利そう。

試しに実行した結果を以下に掲示していく。

コマンド

まず、rails newでアプリを作成しないと使えないので、rails newでbooks_appを作成する。

$ rails new books_app

次に、作成されたbooks_appフォルダに移動し、scaffoldコマンドを実行する。

後続についていてるtitle:stringは、DBを作成するマイグレーションファイルを作成する時に使用される。

$ cd books_app/
$ rails g scaffold book title:string

この状態では、マイグレーションファイルが作られただけなので、サーバを起動してもDBにテーブルがない状態になる。 そのため、migrateしてDBにテーブルを作成する。

rails db:migrate

これでサーバを起動する準備ができたので、サーバを起動する。

rails s

http://localhost:3000/booksにアクセスすると以下のようにページが出来上がっていることがわかる。

f:id:rosh-1228:20220204104537p:plain

できたページ

先ほど表示したページでNew Bookをクリックすることで、本の新規作成ページに遷移する。

ここで、本を作成することができる。

f:id:rosh-1228:20220204104737p:plain

実際に本を作成すると、以下のように本の作成に成功したとメッセージを表示することができる。

f:id:rosh-1228:20220204104804p:plain

次にeditをクリックすると、以下のように本のタイトルを編集することができる。

f:id:rosh-1228:20220204104836p:plain

Update Bookをクリックすることで、本のタイトルを編集することができる。

編集に成功すると以下のようにメッセージが表示される。 f:id:rosh-1228:20220204104922p:plain

Backを押すとShow Edit Destroyと表示されており、Destroyを押すことで作成した本を削除するこができる。

f:id:rosh-1228:20220204104948p:plain

f:id:rosh-1228:20220204105023p:plain

アプリのファイルの内容

できたアプリの内容を確認していく。 モデルファイルのapp/models/book.rbも作成されている。

f:id:rosh-1228:20220204112816p:plain

コントローラファイルにはapp/controller/books_controller.rbが作成されており、CRUDを扱うメソッドが用意されている。

def show; endのように、使っていないメソッドを1行にすることもできる。

class BooksController < ApplicationController
  before_action :set_book, only: %i[ show edit update destroy ]

  # GET /books or /books.json
  def index
    @books = Book.all
  end

  # GET /books/1 or /books/1.json
  def show; end

  # GET /books/new
  def new
    @book = Book.new
  end

  # GET /books/1/edit
  def edit; end

  # POST /books or /books.json
  def create
    @book = Book.new(book_params)

    respond_to do |format|
      if @book.save
        format.html { redirect_to book_url(@book), notice: "Book was successfully created." }
        format.json { render :show, status: :created, location: @book }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @book.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /books/1 or /books/1.json
  def update
    respond_to do |format|
      if @book.update(book_params)
        format.html { redirect_to book_url(@book), notice: "Book was successfully updated." }
        format.json { render :show, status: :ok, location: @book }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @book.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /books/1 or /books/1.json
  def destroy
    @book.destroy

    respond_to do |format|
      format.html { redirect_to books_url, notice: "Book was successfully destroyed." }
      format.json { head :no_content }
    end
  end

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

    # Only allow a list of trusted parameters through.
    def book_params
      params.require(:book).permit(:title)
    end
end

app/views/books/にはCRUDを扱うビューファイルが作成されている。

f:id:rosh-1228:20220204110447p:plain

このようにscaffoldで作成されたファイルを編集していくこと自分が作りたいアプリを作っていくことができて便利だなと思った。

Nginxで設定したVirtualHostの複数ドメインをSSLに対応させた

今回やったこと

  • VirtualHostで設定したそれぞれのドメインSSLに対応させた

    前提

  • Debian 10
  • Nginx
    • VirtualHostの設定をして、2つのドメインを使ってそれぞれ別のhtmlを表示させている

概要

公式の手順通り進めてたけど、証明書をインストールする段階でNginxのプラグインがないとログに出ており、そこで対応したことを残す。

証明書のインストール

certbotの公式を使用して進める。 SoftwareにNginx、SystemにDebian 10を選択すると手順が表示されるので、その通りに実行する。(エラーで詰まったところまでは割愛) f:id:rosh-1228:20210805154009p:plain

つまったところ

sudo certbot --nginxを実行した時に以下のエラーが表示される。 /var/log/letsencrypt/letsencrypt.logを読めと書いてあるので従う。

$ sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
The requested nginx plugin does not appear to be installed

ログを見ると、Nginxのプラグインが不足しているぽい。

ここでこちらの記事を参考にさせていただきました。

2021-08-04 15:38:00,827:DEBUG:certbot.main:certbot version: 0.31.0
2021-08-04 15:38:00,827:DEBUG:certbot.main:Arguments: ['--nginx']
2021-08-04 15:38:00,828:DEBUG:certbot.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot)
2021-08-04 15:38:00,833:DEBUG:certbot.log:Root logging level set at 20
2021-08-04 15:38:00,833:INFO:certbot.log:Saving debug log to /var/log/letsencrypt/letsencrypt.log
2021-08-04 15:38:00,834:DEBUG:certbot.plugins.selection:Requested authenticator nginx and installer nginx
2021-08-04 15:38:00,834:DEBUG:certbot.plugins.selection:No candidate plugin
2021-08-04 15:38:00,834:DEBUG:certbot.plugins.selection:Selected authenticator None and installer None

python3-certbot-nginxをインストール。

sudo apt install python3-certbot-nginx

動いた。

$ sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

参考

NGINXが動作するRHEL8にSSL設定をします。

NginxでVirtualHostを設定した

今回やったこと

  • nginxのVirtualHostを使ってhtmlを表示
  • www.○○○.net○○○.netの複数ドメインを使って自身のhtmlを表示

前提条件

参考

設定は以下3つのサイトを参考させていただきました。 大変助かりました!

概要

ざっくりと書くと以下の順番で設定

  1. お名前.comでドメインを取得
  2. さくらインターネットドメインの登録を行い、ネームサーバの確認
  3. お名前.comでネームサーバの設定
  4. nginxでvirtualhostの設定

アクセスするときの概要を図にするとこんな感じ f:id:rosh-1228:20210804084421p:plain

お名前.comでドメインを取得

お名前.comドメインを取得する。 今回は安くなっていた.netドメインを取得した。

さくらインターネットでネームサーバを確認

さくらインターネットの会員メニューへログイン

契約中のドメイン一覧をクリック

f:id:rosh-1228:20210804085349p:plain

ドメインメニューをクリック f:id:rosh-1228:20210804085514p:plain

ドメインメニューからネームサーバ新規登録をクリック f:id:rosh-1228:20210804085814p:plain

ドメインメニューにお名前.comで取得したドメインを入力し、送信をクリック

f:id:rosh-1228:20210804090042p:plain

管理ドメインとネームサーバの一覧でさっき登録したドメインが表示されているので、ゾーン編集をクリック f:id:rosh-1228:20210804090300p:plain

サーバのIPアドレスを入力して送信するをクリック f:id:rosh-1228:20210804090744p:plain

ネームサーバが2つ表示されている(タイプNSの行に表示されている)ので、これをお名前.comのネームサーバ設定で使う

お名前.comでネームサーバの設定

お名前ドットコムnaviにアクセスし、ドメイン機能一覧をクリック f:id:rosh-1228:20210804091115p:plain

ネームサーバの変更をクリック

f:id:rosh-1228:20210804091225p:plain

ドメイン名にチェックを入れ

f:id:rosh-1228:20210804091348p:plain

「2.ネームサーバの選択」-「その他」をクリックし、さくらインターネットで確認したネームサーバを2つ入力し、下にある確認ボタンをクリック f:id:rosh-1228:20210804091508p:plain

これで自身の端末(自分はmac)でnslookupで名前解決されていることを確認。

server can't find ○○○.net: SERVFAILと表示された場合、さくらインターネットかお名前.comで設定の反映に時間がかかっていると思われる。

自分の場合は15分くらいまって再度nslookupを実行すると名前解決された。

nginxでvirtualhostの設定

お名前.comをさくらインターネットの設定が完了したので、nginxの設定をしていく。

virtual host用のデータ配置用のディレクトリを作成

sudo mkdir /home/demo/public_html

公開用ディレクトリやログ用のディレクトリを作成

sudo mkdir -p /home/demo/public_html/○○○.net/public
sudo mkdir -p /home/demo/public_html/○○○.net/log

publicの下に○○○.netにアクセスした時に表示させたいindex.htmlを作成(中身はなんでも)

sudo vi /home/demo/public_html/○○○.net/public/index.html

virtual hostの設定ファイルを作成

sudo vi /etc/nginx/sites-available/○○○.net

内容は以下のような感じで、2つのserverコンテキストにあるserver_nameにそれぞれ表示させたいドメインを書く /usr/share/nginx/html/var/log/nginxはnginxをインストールしたときにデフォルトディレクト

server {
      listen 80;
      server_name www.○○○.net;
      access_log /var/log/nginx/access.log;
      error_log /var/log/nginx/error.log;
      location / {
                 root /usr/share/nginx/html;
                 index index.html;
                 }
       }
server {
      listen 80;
      server_name ○○○.net;
      access_log /home/demo/public_html/○○○.net/log/access.log;
      error_log /home/demo/public_html/○○○.net/log/error.log;
      location / {
                root /home/demo/public_html/○○○.net/public/;
                index index.html;
                }
      }

nginxが設定を読み込んでくれるようにシンボリックリンクを作成

sudo ln -s /etc/nginx/sites-available/○○○.net /etc/nginx/sites-enabled/○○○.net

/etc/nginx/nginx.confの下の方にあるincludeに以下の設定をする

#コメントアウトしているのは、デフォルトの設定

自分は今回コメントアウトした

#include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

最後にnginxサービスを停止・起動する

sudo service nginx stop
sudo service nginx start

これでwww.○○○.netでも○○○.netのどちらでもそれぞれのhtmlが表示できるようになった。