20210508のRailsに関する記事は11件です。

【Rails】マイグレーションファイルで作ったテーブルヘッダーを確認する方法

ヘッダー確認方法 マイグレーションファイルでテーブルを作成した時に、seedでデータを作成する際にテーブルヘッダー名を確認する方法をご紹介します。 railsコンソールで確認 Railsコンソールを起動し、対象のインスタンスを作成することで、カラムが確認できます。 ターミナル #Railsコンソールを起動 rails c #対象のインスタンスを作ることで、カラムが確認できます User.new (50.1ms) SELECT sqlite_version(*) => #<User id: nil, name: nil, email: nil, password: nil, address: nil,created_at: nil, updated_at: nil> schemaファイルで確認 migrateファイルと同じディレクトリにあるschema.rbファイルでヘッダー名を確認できます。 schema.rb ActiveRecord::Schema.define(version: 2021_05_06_105214) do create_table "users", force: :cascade do |t| t.string "name", null: false t.string "email", null: false t.string "password", null: false t.text "address" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end end 参考 unknown attribute '○○○○' for ○○○. →カラムのリネーム https://qiita.com/Ayaka_ramens/items/f0c68b08fcf6145c2b17
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

deviseでカラムのnot null制約を外す(複数)

初めまして。 プログラミング学習初心者で、ログイン機能実装した際に 新規ログインで ActiveRecord::NotNullViolation in Customers::RegistrationsController#create とエラーが表示されてしまい、その解決方法です。 やること 今回は、deviseで最初にカラムを追加してdb:midrateしてしまった後に 実は null: false ではなかったときの対処法です。 なんでもかんでも null: false にしてしまっていましたが、 createするときに空の状態で保存されるのを防ぐためのものと認識せず記載していました。 制約を外す migrate後に null:false を複数訂正したいときはターミナルに rails g migration ChangeColumnToNull 出来上がったマイグレーションファイルがdb/migrateにあるので、 #customersデーブルのカラム、trainersテーブルのカラムのnot null制約を外す def up #Not Null制約を外す change_column_null :customers, :name, true change_column_null :customers, :age, true change_column_null :trainers, :name, true : : end def down change_column_null :customers, :name, false change_column_null :customers, :age, false change_column_null :trainers, :name, false : : end とし、ターミナルで rails db:migrate とすると null: false がなくなります。 以上となります。 違った点がありましたらご指摘お願い致します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでRails環境を構築する

最近副業でRailsを始めたので勉強がてらRailsやろうとなったので、Dockerで環境構築してみました。 作ったものはこちら 構成 下記構成で作成します。 Ruby Nginx MySQL ディレクトリ構造はこんな感じです。 Railsの動作環境の作成 Rails用のDockerfileの作成 まずはDockerfileを作成します。 srcディレクトリを作成し、中にDockerfileを作成。 内容は下記の様にします。 src/Dockerfile # マルチステージビルドでNode入れる FROM node:14-alpine as node FROM ruby:2.7 # nodeとyarnコピー COPY --from=node /opt/yarn-* /opt/yarn # シンボリックリンクはる RUN ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn RUN apt-get update && \ apt-get install -y git vim less build-essential graphviz cron bash g++ nodejs && \ apt-get clean #Railsアプリのルートディレクトリ作成 ENV RAILS_ROOT /var/www/src RUN mkdir -p $RAILS_ROOT WORKDIR $RAILS_ROOT RUN mkdir -p $RAILS_ROOT/tmp/sockets && mkdir -p $RAILS_ROOT/tmp/pids RUN node -v && yarn -v # ホストのGemfileのコピー COPY Gemfile Gemfile COPY Gemfile.lock Gemfile.lock RUN bundle install --jobs 20 --retry 5 解説はコメントにある通りですが、ベースイメージにruby:2.7を使用します。 なにが使えるかや、どんなイメージが有るかはDockerHubを見ます。 Railsは使用するのにNode.jsが必要です。 そのため、マルチステージビルドというのを利用します。 簡単に言うと、フォルダ内部のファイル移動と似たようなイメージです。 FROM node:14-alpine as nodeでnodeの環境ビルドされるので、そこからnodeを使うためのものを全部移動しましょう的なことです。 あとは、Railsで使うもの入れてます。 /tmp/socketsはUnixソケットでnginxと通信したいので配置用のフォルダです。 RUN node -v && yarn -vは仮にnodeやyarnがなかったときにビルドの途中で落としたいのでいれてます。 Gemfileの作成 src内にGemfileとGemfile.lockを作成します。仮に既存のプロジェクトの場合はここに配置します。 Gemfileは下記の様にしておきます。Gemfile.lockは空で大丈夫です。 source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.3' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 6.1.0' docker-compseを作成しnginxとMySQLと連携する 作業ディレクトリ(srcの1つ上)内にdocker-compose.ymlを作成します。 内容はこんな感じです。 docker-compose.yml version: '3' networks: rails: volumes: db-volume: bundle-data: tmp-data: services: nginx: image: nginx:stable-alpine container_name: nginx ports: - ${APP_PORT:-80}:80 volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ./nginx/logs:/var/log/nginx - tmp-data:/var/www/src/tmp depends_on: - rails networks: - rails rails_db: image: mysql:8.0 container_name: rails_db command: --default-authentication-plugin=mysql_native_password ports: - ${DB_PORT:-3360}:3306 volumes: - db-volume:/var/lib/mysql environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_USER: ${DB_USERNAME} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_RANDOM_ROOT_PASSWORD: 'yes' networks: - rails rails: container_name: rails build: context: ./src dockerfile: Dockerfile depends_on: - rails_db volumes: - .:/var/www - bundle-data:/usr/local/bundle #ソケット通信用ファイルをnginxコンテナと共有 - tmp-data:/var/www/src/tmp command: puma -b unix:/var/www/src/tmp/sockets/puma.sock environment: TZ: 'Asia/Tokyo' DB_HOST: rails_db DB_DATABASE: ${DB_DATABASE} DB_USERNAME: ${DB_USERNAME} DB_PASSWORD: ${DB_PASSWORD} networks: - rails まずはnginxから nginxのイメージをそのまま利用します。 設定ファイルをバインドマウントしてます。UnixソケットはRailsコンテナのが必要なので、名前付きボリュームで共有しています。 その他エラー時に対応したいのでlogもバインドしてます。 設定ファイルは後述します。 次にMySQLです。 MySQLのイメージをそのまま利用します。 commandで認証方式を変更しています。 あとは環境変数の設定しています。 次にRailsです。 buildに先程作成したDockerfileを指定します。 tmp-dataにはpumaのソケット場所をしています。 そして、commandでUnixソケットで接続するように指定します。 railsのpuma.rbを指定してもいいのですが、記載不要で対応したいのでcommandで行います。 環境変数 環境変数を設定していきます。 ${DB_PASSWORD}のようになってる箇所ですね。 作業ディレクトリ内に.envを作成します。 DBの接続情報を記載します。DB_HOSTはrailsにわたすようにMySQLのコンテナ名を記載します。 .env DB_PORT=3360 DB_DATABASE=rails DB_USERNAME=homestead DB_PASSWORD=secret DB_HOST=rails_db nginx設定 作業ディレクトリにnginxディレクトを作成します。 default.confを作成します。 default.confの内容は下記です。 default.conf upstream rails_app { # ソケット通信したいのでpuma.sockを指定 server unix:/var/www/src/tmp/sockets/puma.sock; } server { listen 80; # ドメインもしくはIPを指定 server_name localhost; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # ドキュメントルートの指定 root /var/www/src/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @rails; keepalive_timeout 5; location ~ /\. { deny all; } location ~* ^.+\.(rb|log)$ { deny all; } # リバースプロキシ関連の設定 location @rails { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://rails_app; } } ソケット通信の設定とログの出力先を設定しています。 RailsでMySQLの接続情報 src/config/database.ymlからDBの接続情報を変更します。 default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> database: <%= ENV.fetch('DB_DATABASE', 'rails') %> username: <%= ENV.fetch('DB_USERNAME', 'homestead') %> password: <%= ENV.fetch('DB_PASSWORD', 'secret') %> host: <%= ENV.fetch('DB_HOST', 'rails_db') %> 起動する あとは起動しましょう! Railsの新規プロジェクトの場合は下記の様にプロジェクトを作成しましょう。 オプションは自分がイラないもの省いているのと、データベースをMySQLで作成してます。 docker-compose run --rm rails rails new . --force --database=mysql --skip-test --skip-turbolinks プロジェクトができたら、docker-compose up -d --buildでコンテナを全部立ち上げます。 http:localhostでアクセスできたらOK! 502が出たらnginxのエラーログを見てみましょう
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails6]AWS本番環境でActionCableの使用ができるようにする

はじめに Rails6を使用して、AWSにデプロイするもActionCableで実装したチャットが一切機能しなくて困ったので、その時の解決方法を以下に記述します! 結論 3点の設定が必要です。 1.cable.yml 2.production.rb 3.rails.conf(もしくはアプリケーション名.conf) cable.ymlの設定 cable.ymlとはActionCableを使用する際の設定を記述するファイルです。 ここでは、本番環境の仕様設定に編集を加えます。 adapter(前提知識) ActionCableは、サーバーから送信された情報をクライアントへ提供する仕組みになります。その仕組みと連携するためのものをadapterと言います。 使用できるadapterの種類には、以下表の3通りがあります。 種類 内容 Asyncアダプタ 無料で導入が可能だが、パフォーマンスの面から本番環境での利用は非推奨。ただしポートフォリオ程度なら問題ない Redisアダプタ 本番環境での利用が推奨されている。、EC2を用いたデプロイを行う際に、幾らか料金がかかる PostgreSQLアダプタ 本番環境での利用が推奨されている。PostgreSQLを使用していることが条件 以上を踏まえ、以下のように編集しましょう cable.yml development: adapter: async test: adapter: test production: adapter: async # 追記 # adapter: redis 削除 url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> channel_prefix: mini_talk_app_production production.rbの設定 ActionCableは、指定されていないオリジンからのリクエストを受け付けない設定になっているはずです。 これでは使い物にならないので編集しましょう! config/environments/production.rb Rails.application.configure do # 省略 #どっかに記述してOK ActionCable.server.config.disable_request_forgery_protection = true config.action_cable.url = "ws://【Elastic IP】/cable" config.action_cable.allowed_request_origins = ['http://【Elastic IP】'] # 省略 end rails.confの編集 Nginxの設定ファイルにあたるrails.confを編集しましょう。 ActionCableを用いる場合、サーバーサイドへのリクエストを受け取る役目のあるWebサーバーにて、websocketの仕組みを用いるための設定をする必要があります。 /etc/nginx/conf.d/rails.conf upstream app_server { server unix:/var/www/アプリケーション名/shared/tmp/sockets/unicorn.sock; } server { #省略 # -------------------ここから------------------- # /cableのパスに対してwebsocketの仕組みを用いるための設定 location /cable { proxy_pass http://app_server/cable; proxy_http_version 1.1; proxy_set_header Upgrade websocket; proxy_set_header Connection Upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # -------------------ここまでを追記------------------- #省略 } ここで僕がはまったのは、一行目の〇〇_serverとproxy_pass http://〇〇_server/cable;は一致させてください。訳もわからずコピるとエラーになります! 再起動 あとはターミナルでお馴染みの再起動!!! # 読み込み直し sudo systemctl reload nginx # 再起動 sudo systemctl restart nginx これで使えるようになりました!! おわりに 今は細かいところは分からなくても、「とりあえず知っている」ってとても大切なことなので、是非記事の方熟読してみてください!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【RSpec】expect{ }.to change{ MODEL.count }.by(1) がエラーになるときの対処法 【Capybara】

起こったエラー フォーム送信後にBookの数が増えることをテストしたい。 expect{ click_on "Submit" }.to change{ Book.count }.by(1) 次のエラーが出た。 Failure/Error: expect{ click_on "Submit" }.to change{ Book.count }.by(1) expected `Book.count` to have changed by 1, but was changed by 0 フォーム送信時に起こるAjaxの通信が原因らしい。 対処法 次のようにhave_content()をつけるとうまくいく。 expect{ click_on "Submit" expect(page).to have_content("Created a new Book") }.to change{ Book.count }.by(1) おわり、
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Bootsnap::CompileCache::PermissionError

詳細画面に遷移するときshowアクションが動くときだけエラーが出る 開発環境  ruby: 2.6.5 rails: 6.1.3.1 試した事リスト • tmp/cache/bootsnap/compile-cacheのパーミッションを変更 • boot.rbの設定を変更 • casheファイルの削除 <= 解決 パーミッションの変更 $ sudo chown 777 tmp/cache/bootsnap/compile-cache  ※ パーミッションを変更する時にむやみやたらに777を指定するのはよくない boot.rb $ #require 'bootsnap/setup' コメントアウトして、bootsnapを使用しないようにできるみたいです tmp/cache/bootsnap/ディレクトリ内にあるファイル二つを削除 $ sudo rm -r tmp/cache/bootsnap/compile-cache $ sudo rm -rf tmp/cache/bootsnap/load-path-cache casheファイル削除で解決  まずはエラー文通りにパーミッションをみていきました。 そのつぎにエラー文でググっていき解決といった感じです。 permissionErrorと出てきても焦らず、permission以外の部分でも原因がないか多方面に考えていきました。 bootsnap このエラーが出てきた時に初めてbootsnapというものが何なのか勉強しました。 railsの起動を早めるようなものみたいで、なくてもいいっぽいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails にてデータベースのテーブルを確認したい場合の方法

背景 Railsにてデータベースを作成した後、テーブルのカラム等中身を確認をしたい場合があります。 解決策 その時は「rails db」 コマンドを使い、データベースに接続することができます。 rails db 中略 mysql> 接続できたら各々のDBの操作方法(MySQLやpostgresqlのコマンド)で操作が可能です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】ログイン前ユーザーのアクセス制限機能

はじめに deviseを利用したログイン前のユーザーのアクセス制限機能の実装についての備忘録です。 初学者のため間違った知識を公開している可能性もあるため遠慮なく指摘して頂ければと思います。       手順 基本的には下記の記述を任意のコントローラーに追加することで実装できる。 application_controller.rb before_action :authenticate_user!       一部のページをアクセス制限の対象から除外する場合は以下のように記述する。 application_controller.rb before_action :authenticate_user!, except: [:top]       このようにオプションとしてexcept: [:アクション名]を使用することでトップページだけはログイン前でもアクセス可能になる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsのpolymorphicに触れる

何をしたのか 今までpolymorphicについてなんとなくで使っていたので、理解を深める目的でpolymorphicを触れました。 今回の使用例 今回は下記の図のmodelを使います。 Comic(漫画)とNovel(小説)がそれぞれAuthor(著者)という子モデルを持っているという状態です。 それぞれのモデルのコードは下記のようになっています。 author.rb class Author < ApplicationRecord belongs_to :bookable, polymorphic: true end comic.rb class Comic < ApplicationRecord has_many :authors, as: :bookable end novel.rb class Novel < ApplicationRecord has_many :authors, as: :bookable end それぞれ下記のように値が入っているとします。 Authorから親モデルを取得したいときは下記のようなコードで取得できます。 Author.find(1).comic.title Author.find(3).novel.title ↓ # 両方ともbookableで取得できます。 Author.find(1).bookable.title #=> ワンピース Author.find(3).bookable.title #=> 白夜行 ここでpolymorphicが便利なのはAuthorの親モデルがComicかNovelかを気にせずbookableで取得できるところにあると思います。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails6】deviseで独自カラムを追加して使用する方法 ②

これまで これまでに、deviseのインストールと、Userモデルの作成を行いました。 今回は、ビューのカスタマイズを行っていきたいと思います。 ▽前回の記事はこちら▽ 【Rails6】deviseで独自カラムを追加して使用する方法 ① ① View 作成 View を追加するrails g devise:views コマンドを実行 rails g devise:views Running via Spring preloader in process 1254 invoke Devise::Generators::SharedViewsGenerator create app/views/devise/shared #フォルダ create app/views/devise/shared/_error_messages.html.erb #エラーメッセージ用パーシャル create app/views/devise/shared/_links.html.erb #リンク用パーシャル invoke form_for create app/views/devise/confirmations #フォルダ create app/views/devise/confirmations/new.html.erb #認証メール再送信画面 create app/views/devise/passwords #フォルダ create app/views/devise/passwords/edit.html.erb #パスワード変更画面 create app/views/devise/passwords/new.html.erb #パスワード初期化メール送信画面 create app/views/devise/registrations #フォルダ create app/views/devise/registrations/edit.html.erb #ユーザ情報変更画面 create app/views/devise/registrations/new.html.erb #ユーザ新規登録画面 create app/views/devise/sessions #フォルダ create app/views/devise/sessions/new.html.erb #ログイン画面 create app/views/devise/unlocks create app/views/devise/unlocks/new.html.erb #ロック解除メール再送信画面 invoke erb create app/views/devise/mailer #フォルダ create app/views/devise/mailer/confirmation_instructions.html.erb #アカウント認証メール create app/views/devise/mailer/email_changed.html.erb #メールアドレス変更完了メール create app/views/devise/mailer/password_change.html.erb #パスワード変更完了メール create app/views/devise/mailer/reset_password_instructions.html.erb #パスワード初期化メール create app/views/devise/mailer/unlock_instructions.html.erb #ロック解除メール 上記コマンドで、ひと通り devise 用の View ( 各ファイルに # でファイルの用途を記載しました ) が生成されます。 今から、それぞれの View をカスタマイズしていきます。 ② View の構成 devise View 用のレイアウトテンプレートを用意し、画面を表示させようと思います。 ③ レイアウトテンプレート 作成 /app/views/layouts 内に devise.html.erb という名前のファイルを作成します。 devise.html.erb <!DOCTYPE html> <html lang="ja-JP" dir="ltr"> <head> <!-- Meta_Tags--> <%= csrf_meta_tags %> <%= csp_meta_tag %> <!-- Page_Title--> <title><%= @page_title%> | Sample</title> <!-- Stylesheets--> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> </head> <body> <!-- メッセージ表示用--> <% flash.each do |message_type, message| %> <p><%= message %></p> <% end %> <%= yield %> <!-- JavaScripts--> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </body> </html> ※ 今回分かりやすくするように devise.html.erb というファイル名にしましたが、決まりはありません。 ④ app/views/devise/shared パーシャル カスタマイズ 今回は日本語表記への変更のみを行います。 _links.html.erb_編集前 <%- if controller_name != 'sessions' %> <%= link_to "Log in", new_session_path(resource_name) %><br /> <% end %> <%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%= link_to "Sign up", new_registration_path(resource_name) %><br /> <% end %> <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %> <%= link_to "Forgot your password?", new_password_path(resource_name) %><br /> <% end %> <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br /> <% end %> <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br /> <% end %> <%- if devise_mapping.omniauthable? %> <%- resource_class.omniauth_providers.each do |provider| %> <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %><br /> <% end %> <% end %> _links.html.erb_編集後 <%- if controller_name != 'sessions' %> <%= link_to "ログイン", new_session_path(resource_name) %><br /> <% end %> <%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%= link_to "ユーザ登録", new_registration_path(resource_name) %><br /> <% end %> <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %> <%= link_to "パスワードを忘れた場合", new_password_path(resource_name) %><br /> <% end %> <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> <%= link_to "確認メールが届かない場合", new_confirmation_path(resource_name) %><br /> <% end %> <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> <%= link_to "ロック解除メールが届かない場合", new_unlock_path(resource_name) %><br /> <% end %> <%- if devise_mapping.omniauthable? %> <%- resource_class.omniauth_providers.each do |provider| %> <%= link_to "#{OmniAuth::Utils.camelize(provider)} でログイン", omniauth_authorize_path(resource_name, provider) %><br /> <% end %> <% end %> ※ここでは _error_messages.html.erb のカスタマイズは行いませんが、必要に応じて行なってください。 ⑤ app/views/devise/confirmations カスタマイズ 今回は日本語表記への変更のみを行います。 new.html.erb_編集前 <h2>Resend confirmation instructions</h2> <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %> </div> <div class="actions"> <%= f.submit "Resend confirmation instructions" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb_編集後 <h2>確認メールの再送</h2> <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %> </div> <div class="actions"> <%= f.submit "確認メール再送信" %> </div> <% end %> <%= render "devise/shared/links" %> ⑥ app/views/devise/passwords カスタマイズ 今回は日本語表記への変更のみを行います。 edit.html.erb edit.html.erb_編集前 <h2>Change your password</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <%= f.hidden_field :reset_password_token %> <div class="field"> <%= f.label :password, "New password" %><br /> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em><br /> <% end %> <%= f.password_field :password, autofocus: true, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation, "Confirm new password" %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "Change my password" %> </div> <% end %> <%= render "devise/shared/links" %> edit.html.erb_編集後 <h2>パスワードの変更</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <%= f.hidden_field :reset_password_token %> <div class="field"> <%= f.label :password, "新しいパスワード" %><br /> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em><br /> <% end %> <%= f.password_field :password, autofocus: true, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation, "新しいパスワード確認" %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "パスワードの変更" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb new.html.erb_編集前 <h2>Forgot your password?</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="actions"> <%= f.submit "Send me reset password instructions" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb_編集後 <h2>パスワードを忘れた場合</h2> <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="actions"> <%= f.submit "パスワードの初期化手順を送信" %> </div> <% end %> <%= render "devise/shared/links" %> ⑦ app/views/devise/registrationss カスタマイズ 今回は 日本語表記への変更 ・ 独自カラム項目の追加 を行います。 edit.html.erb edit.html.erb_編集前 <h2>Edit <%= resource_name.to_s.humanize %></h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %> <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div> <% end %> <div class="field"> <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br /> <%= f.password_field :password, autocomplete: "new-password" %> <% if @minimum_password_length %> <br /> <em><%= @minimum_password_length %> characters minimum</em> <% end %> </div> <div class="field"> <%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br /> <%= f.password_field :current_password, autocomplete: "current-password" %> </div> <div class="actions"> <%= f.submit "Update" %> </div> <% end %> <h3>Cancel my account</h3> <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p> <%= link_to "Back", :back %> edit.html.erb_編後 <h2>ユーザ情報変更 <%= resource_name.to_s.humanize %></h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :ユーザ名 %><br /> <%= f.text_field :user_code %> </div> <div class="field"> <%= f.label :姓 %><br /> <%= f.text_field :user_last_name, autocomplete: "last_name" %> </div> <div class="field"> <%= f.label :名 %><br /> <%= f.text_field :user_first_name, autocomplete: "first_name" %> </div> <!-- メールの認証状況の表示_未確認の場合 --> <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %> <div>メール認証を完了してください : <%= resource.unconfirmed_email %></div> <% end %> <!-- メールの認証状況の表示_未確認の場合(END) --> <div class="field"> <%= f.label :新しいパスワード %> <i>(変更しない場合は空白)</i><br /> <%= f.password_field :password, autocomplete: "new-password" %> <% if @minimum_password_length %> <br /> <em><%= @minimum_password_length %> characters minimum</em> <% end %> </div> <div class="field"> <%= f.label :新しいパスワード確認 %><br /> <%= f.password_field :password_confirmation %> </div> <div class="field"> <%= f.label :現在のパスワード %><br /> <%= f.password_field :current_password, autocomplete: "current-password" %> </div> <div class="actions"> <%= f.submit "更新" %> </div> <% end %> <h3>退会</h3> <p>退会処理を行うと元に戻せません。 <%= button_to "退会する", registration_path(resource_name), data: { confirm: "退会処理を行います" }, method: :delete %></p> <%= link_to "戻る", :back %> new.html.erb new.html.erb_編集前 <h2>Sign up</h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :password %> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em> <% end %><br /> <%= f.password_field :password, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "Sign up" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb_編集後 <h2>ユーザ登録</h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :ユーザ名 %><br /> <%= f.text_field :user_code %> </div> <div class="field"> <%= f.label :姓 %><br /> <%= f.text_field :user_last_name, autocomplete: "last_name" %> </div> <div class="field"> <%= f.label :名 %><br /> <%= f.text_field :user_first_name, autocomplete: "first_name" %> </div> <div class="field"> <%= f.label :パスワード %> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %>文字以上)</em> <% end %><br /> <%= f.password_field :password, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :パスワード確認 %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "ユーザ登録" %> </div> <% end %> <%= render "devise/shared/links" %> ⑧ app/views/devise/sessions カスタマイズ 今回は 日本語表記への変更 ・ ログインをメールアドレスから独自カラムへ変更 を行います。 new.html.erb_編集前 <h2>Log in</h2> <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :password %><br /> <%= f.password_field :password, autocomplete: "current-password" %> </div> <% if devise_mapping.rememberable? %> <div class="field"> <%= f.check_box :remember_me %> <%= f.label :remember_me %> </div> <% end %> <div class="actions"> <%= f.submit "Log in" %> </div> <% end %> <%= render "devise/shared/links" %> new.html.erb_編集後 <h2>ログイン</h2> <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> <div class="field"> <%= f.label :ユーザ名 %><br /> <%= f.text_field :user_code, autofocus: true, autocomplete: "user_code" %> </div> <div class="field"> <%= f.label :パスワード %><br /> <%= f.password_field :password, autocomplete: "current-password" %> </div> <% if devise_mapping.rememberable? %> <div class="field"> <%= f.check_box :ログイン情報を記憶しておく %> <%= f.label :ログイン情報を記憶しておく %> </div> <% end %> <div class="actions"> <%= f.submit "ログイン" %> </div> <% end %> <%= render "devise/shared/links" %> ⑨ app/views/devise/unlocks カスタマイズ 今回は日本語表記への変更のみを行います。 new.html.erb <h2>ロック解除メール再送</h2> <%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <%= f.label :メールアドレス %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="actions"> <%= f.submit "ロック解除メール再送信" %> </div> <% end %> <%= render "devise/shared/links" %> ⑩ app/views/devise/mailer メールテンプレート カスタマイズ 今回は日本語表記への変更のみを行います。 confirmation_instructions.html.erb confirmation_instructions.html.erb_変更前 <p>Welcome <%= @email %>!</p> <p>You can confirm your account email through the link below:</p> <p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p> confirmation_instructions.html.erb_変更後 <p>ようこそ <%= @ user_last_name %> 様</p> <p>下記のURLから登録を完了させてください。</p> <p><%= link_to '登録', confirmation_url(@resource, confirmation_token: @token) %></p> email_changed.html.erb email_changed.html.erb_編集前 <p>Hello <%= @email %>!</p> <% if @resource.try(:unconfirmed_email?) %> <p>We're contacting you to notify you that your email is being changed to <%= @resource.unconfirmed_email %>.</p> <% else %> <p>We're contacting you to notify you that your email has been changed to <%= @resource.email %>.</p> <% end %> email_changed.html.erb_編集後 <p><%= @user_last_name %> 様</p> <% if @resource.try(:unconfirmed_email?) %> <p><%= @resource.unconfirmed_email %>にメールアドレスが変更されました。</p> <% else %> <p><%= @resource.email %>にメールアドレスが変更されました。</p> <% end %> password_change.html.erb password_change.html.erb_編集前 <p>Hello <%= @resource.email %>!</p> <p>We're contacting you to notify you that your password has been changed.</p> password_change.html.erb_編集後 <p><%= @resource.user_last_name %> 様</p> <p>パスワードが変更されました。</p> reset_password_instructions.html.erb reset_password_instructions.html.erb_編集前 <p>Hello <%= @resource.email %>!</p> <p>Someone has requested a link to change your password. You can do this through the link below.</p> <p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p> <p>If you didn't request this, please ignore this email.</p> <p>Your password won't change until you access the link above and create a new one.</p> reset_password_instructions.html.erb_編集後 <p><%= @resource.user_last_name %> 様</p> <p>パスワードの初期化メールが送信されました。下記のURLからパスワードの再設定が行えます。</p> <p><%= link_to 'パスワードの再設定', edit_password_url(@resource, reset_password_token: @token) %></p> <p>お心当たりのないメールはお手数ですが削除をお願いいたします。 </p> <p>上記のURLからパスワードの再設定が行われるまで、パスワードは変更されません。</p> unlock_instructions.html.erb unlock_instructions.html.erb_編集前 <p>Hello <%= @resource.email %>!</p> <p>Your account has been locked due to an excessive number of unsuccessful sign in attempts.</p> <p>Click the link below to unlock your account:</p> <p><%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %></p> unlock_instructions.html.erb_編集後 <p><%= @resource.user_last_name %> 様</p> <p>ログインに失敗した回数が多いため、アカウントがロックされました。</p> <p>アカウントのロック解除するには、下記のURLをクリックしてください。</p> <p><%= link_to 'ロックの解除', unlock_url(@resource, unlock_token: @token) %></p> ここまで行うと、ビューのカスタマイズが反映されます。 長くなりましたので、記事を分けてご紹介しようと思います。 次回は、コントローラ・モデル・ルーティングの設定を行っていきたいと思います。 ▽次の記事はこちら▽ 【Rails6】deviseで独自カラムを追加して使用する方法 ③ ~ 申し訳ございません。公開までしばらくお待ちください。 ~
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails 7つのアクション

Rails 7つアクション ・index → 一覧表示 ・show → 詳細表示 ・new → 生成 ・create → 保存 ・edit → 編集 ・update → 更新 ・destroy → 削除 resourcesメソッド 7つのアクションへのルーティングを自動生成するメソッドです。 resourcesの引数に、:tweetsとシンボルで指定すると、/tweetsのパスに対応するルーティングが生成されます。 例 resources :tweets onlyオプション resourcesにオプションとしてonlyを加えると指定したアクションのみのルーティングを自動生成します。 例 resources :tweets, only: :index
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む