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
にアクセスすると以下のようにページが出来上がっていることがわかる。
できたページ
先ほど表示したページでNew Book
をクリックすることで、本の新規作成ページに遷移する。
ここで、本を作成することができる。
実際に本を作成すると、以下のように本の作成に成功したとメッセージを表示することができる。
次にedit
をクリックすると、以下のように本のタイトルを編集することができる。
Update Book
をクリックすることで、本のタイトルを編集することができる。
編集に成功すると以下のようにメッセージが表示される。
Back
を押すとShow
Edit
Destroy
と表示されており、Destroy
を押すことで作成した本を削除するこができる。
アプリのファイルの内容
できたアプリの内容を確認していく。
モデルファイルのapp/models/book.rb
も作成されている。
コントローラファイルには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を扱うビューファイルが作成されている。
このようにscaffoldで作成されたファイルを編集していくこと自分が作りたいアプリを作っていくことができて便利だなと思った。
Nginxで設定したVirtualHostの複数ドメインをSSLに対応させた
今回やったこと
- VirtualHostで設定したそれぞれのドメインをSSLに対応させた
前提
- Debian 10
- Nginx
- VirtualHostの設定をして、2つのドメインを使ってそれぞれ別のhtmlを表示させている
概要
公式の手順通り進めてたけど、証明書をインストールする段階でNginxのプラグインがないとログに出ており、そこで対応したことを残す。
証明書のインストール
certbotの公式を使用して進める。
SoftwareにNginx
、SystemにDebian 10
を選択すると手順が表示されるので、その通りに実行する。(エラーで詰まったところまでは割愛)
つまったところ
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でVirtualHostを設定した
今回やったこと
- nginxのVirtualHostを使ってhtmlを表示
www.○○○.net
か○○○.net
の複数ドメインを使って自身のhtmlを表示
前提条件
参考
設定は以下3つのサイトを参考させていただきました。 大変助かりました!
- 「さくらのVPS」に「お名前.com」で取得した独自ドメインを割り当てる手順
- nginxのvirtualhostを使って複数ドメインのサイトを作る方法
- プログラミングビギナーNekoteniがあなたに贈る!NginxでVirtual Hostの巻
概要
ざっくりと書くと以下の順番で設定
- お名前.comでドメインを取得
- さくらインターネットでドメインの登録を行い、ネームサーバの確認
- お名前.comでネームサーバの設定
- nginxでvirtualhostの設定
アクセスするときの概要を図にするとこんな感じ
お名前.comでドメインを取得
お名前.comでドメインを取得する。
今回は安くなっていた.net
でドメインを取得した。
さくらインターネットでネームサーバを確認
さくらインターネットの会員メニューへログイン
契約中のドメイン一覧
をクリック
ドメインメニュー
をクリック
ドメインメニューからネームサーバ新規登録
をクリック
ドメインメニューにお名前.comで取得したドメインを入力し、送信をクリック
管理ドメインとネームサーバの一覧でさっき登録したドメインが表示されているので、ゾーン編集をクリック
サーバのIPアドレスを入力して送信するをクリック
ネームサーバが2つ表示されている(タイプNSの行に表示されている)ので、これをお名前.comのネームサーバ設定で使う
お名前.comでネームサーバの設定
お名前ドットコムnaviにアクセスし、ドメイン機能一覧をクリック
ネームサーバの変更をクリック
ドメイン名にチェックを入れ
「2.ネームサーバの選択」-「その他」をクリックし、さくらインターネットで確認したネームサーバを2つ入力し、下にある確認ボタンをクリック
これで自身の端末(自分は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が表示できるようになった。