20210427のRailsに関する記事は25件です。

Railsチュートリアル(第1章)でHerokuへのデプロイに躓いた

概要 Railsチュートリアルにて 1.5.2  Herokuにデプロイする(1) ここの前段階までを終わらせていることが前提 Railsチュートリアルを始めて、Herokuへのデプロイに躓いた(最後のpushコマンドエラー)ので2周目でも同じことをしないために備忘録としての簡単なメモ。 今まではDockerなどを使いローカルでサーバーを立ち上げなどは行なってきたが本番環境にデプロイするのは初めてのこと。 公式ページに載っているエラーとは別物だったが落ち着き払って、エラー文を読み解くことで何に頼ることもなく解決ができた。(初心者からしたらとても大きな一歩) 実際のエラー $ git push heroku master Enumerating objects: 9858, done. Counting objects: 100% (9858/9858), done. Delta compression using up to 8 threads Compressing objects: 100% (6779/6779), done. Writing objects: 100% (9858/9858), 31.74 MiB | 7.80 MiB/s, done. Total 9858 (delta 2483), reused 9848 (delta 2479), pack-reused 0 remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-20 stack remote: -----> Determining which buildpack to use for this app remote: ! Warning: Multiple default buildpacks reported the ability to handle this app. The first buildpack in the list below will be used. remote: Detected buildpacks: Ruby,Node.js remote: See https://devcenter.heroku.com/articles/buildpacks#buildpack-detect-order remote: -----> Ruby app detected remote: -----> Installing bundler 2.2.16 remote: -----> Removing BUNDLED WITH version in the Gemfile.lock remote: -----> Compiling Ruby/Rails remote: -----> Using Ruby version: ruby-2.6.6 remote: -----> Installing dependencies using bundler 2.2.16 remote: Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4 remote: Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock remote: --add-platform x86_64-linux` and try again. remote: Bundler Output: Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock remote: --add-platform x86_64-linux` and try again. remote: remote: ! remote: ! Failed to install gems via Bundler. remote: ! remote: ! Push rejected, failed to compile Ruby app. remote: remote: ! Push failed remote: ! remote: ! ## Warning - The same version of this code has already been built: 1d2acef39bb4522b0be81c5c574ce9b5d1c8d2c7 remote: ! remote: ! We have detected that you have triggered a build from source code with version 1d2acef39bb4522b0be81c5c574ce9b5d1c8d2c7 remote: ! at least twice. One common cause of this behavior is attempting to deploy code from a different branch. remote: ! remote: ! If you are developing on a branch and deploying via git you must run: remote: ! remote: ! git push heroku <branchname>:main remote: ! remote: ! This article goes into details on the behavior: remote: ! https://devcenter.heroku.com/articles/duplicate-build-version remote: remote: Verifying deploy... remote: remote: ! Push rejected to peaceful-shelf-41437. remote: To https://git.heroku.com/peaceful-shelf-41437.git ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'https://git.heroku.com/peaceful-shelf-41437.git' 今回の場合、注目するべき点はここで remote: Bundler Output: Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock remote: --add-platform x86_64-linux` and try again. 雑に超ざっくり訳すと、「あなたがお使いのバンドラーがサポートしているプラットフォームは"x86_64-darwin-20"のみだが、現在のこのローカル環境では"x86_64-linux"が使われている。なので"x86_64-linux"でも動作できるようにlockfileに記述してもう一度トライしてくれ。」と、ご丁寧に解決するためのコマンドまで教えてくれていた。 解決編 (1) ・エラー文での指示通りにコマンドを実行 $ bundle lock --add-platform x86_64-linux Gemfile.lockを覗いてみると 105 nokogiri (1.11.3-x86_64-darwin)↲ 106 racc (~> 1.4)↲ 107 nokogiri (1.11.3-x86_64-linux)↲ 108 racc (~> 1.4)↲ 元から記述されてた(であろう)darwinの下に先ほど追加したlinuxがちゃんと記述されてる! ・Gemfileを書き換えたのでRailsチュートリアルでの教えに倣って再度以下のコマンドを実行 $ bundle install --without production ・Gitの練習も兼ねているのでコミットしてから、再度デプロイにチャレンジ $ git push heroku master . . remote: Verifying deploy... done. 解決編 (2) 失礼、その2はありません。以上でおしまいです。 (やりたかっただけ) おまけ 無事にデプロイが完了すると、生成されたURLをコピーしてブラウザで開くことが出来る。以下が実際の表示ページ renderメソッドエラー起こしてた。 完
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ActiveAdmin で日付カラムのデフォルトを datepicker にする方法

問題 ActiveAdmin では、日付カラムはデフォルトでは :date_select が利用され、結果として年/月/日のフィールドが別々になってしまう。 form do |f| f.semantic_errors f.inputs do f.input :some_date, as: :datepicker f.input :other_field # ... end f.actions end と、 as: :datepicker を付与すれば datepicker が利用可能なものの、デフォルトの挙動を再現するには上のような記述をいちいち行なう必要があり、大体のユースケースである「何か良い感じにモデルだけ指定して後はよろしくやってほしい」ができていないので、これをどうにかしたいと考えた。 解決 以下のように記述を行い、パッチを当てる。 config/application.rb Bundler.require(*Rails.groups) # パッチ開始 module ActiveAdminFormBuilderPatch def default_input_type(*_args, **_kwargs) ret = super ret == :date_select ? :datepicker : ret end end ActiveAdmin::FormBuilder.include ActiveAdminFormBuilderPatch # パッチ終わり module MyApp class Application < Rails::Application # config.hoge = .... end end 結果 date なカラムはデフォルトで :datepicker になった。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails APIモード + devise_token_auth + Vue.js 3 で認証機能付きのSPAを作る(ファイル投稿編)

はじめに 本記事はAPIをRailsのAPIモードで開発し、フロント側をVue.js 3で開発して、認証基盤にdevise_token_authを用いてトークンベースの認証機能付きのSPAを作るチュートリアルのファイル投稿編の記事になります。 前回: Rails APIモード + devise_token_auth + Vue.js 3 で認証機能付きのSPAを作る(Navigation Guard編) ActiveStorageの導入 今回はファイルの保存をRails5.2系以降から使えるようになったActiveStorageを用いて実現してみようと思います。 ActiveStorageとは? Railsガイドの説明を引用します。 Active StorageとはAmazon S3、Google Cloud Storage、Microsoft Azure Storageなどの クラウドストレージサービスへのファイルのアップロードや、ファイルをActive Recordオブジェクトにアタッチする機能を提供します。 出典: https://railsguides.jp/active_storage_overview.html S3やGCSに容易に保存を可能にするGemも提供されています。 今回は本番環境用のストレージに保存する手順については説明を割愛させて頂きます。 導入コマンドの実行 ActiveStorageを導入するには、以下のコマンドを実行する必要があります。 $ bundle exec rails active_storage:install $ bundle exec rails db:migrate active_storage:install を実行すると、ファイルを保存するためのテーブルを定義するmigrationファイルが作成されます。 テーブル構成は以下のように定義されます。(ReleaseNotesテーブルはActiveStorageと関連付けを行ったテーブルです。今回の実装には必要ありません) ファイル保存のattrを定義 ActiveStorageを用いてファイルを保存するには、has_one_attachedメソッドまたはhas_many_attachedメソッドを用いる必要があります。 has_one_attachedメソッドはファイルを1つだけ保存を可能にするメソッドで、 has_many_attachedメソッドはファイルを複数保存できるようにするメソッドです。 今回はhas_one_attachedメソッドの方を用いて実装を行います。 Postモデルに以下の記述を追加してください。 class Post < ApplicationRecord belongs_to :user has_one_attached :icatch # 追加 end これで、icatch属性がPostインスタンスに定義され、読み取りと書き込みが可能になります。 投稿機能APIの修正 ファイルを保存するためにcontrollerを修正する必要がありますので、posts_controller.rbに手を入れます。 controller内でファイルを保存できるように修正 以下のようにcontrollerを修正をしてください。 # app/controllers/posts_controller.rb # N+1回避のために以下の修正を加える def index @posts = Post.eager_load(:user).with_attached_icatch end # 以下を修正 def post_params params.permit(:title, :body, :icatch).merge(user: current_user) end permitメソッドに has_one_attachedで定義した :icatch を指定することで、createアクション内でPostインスタンスを保存するときにファイルも一緒に保存できるようになります。 viewで画像のurlを返却できるように修正 ファイルを保存しただけではフロントにデータを返すことができません。 今回は画像データが保存されると仮定して、画像のURLを返すように実装します。 class Post < ApplicationRecord # 以下のヘルパーを追加 include Rails.application.routes.url_helpers belongs_to :user has_one_attached :icatch # 以下メソッドの追加 def icatch_url return nil unless icatch.attached? url_for(icatch) end end このままだと、icatch_urlメソッドの実行時に以下の例外が発生しますので、 config/environments/development.rbでdefault_url_optionsを設定します。 # 例外 Missing host to link to! Please provide the :host parameter # config/environments/development.rb # Set url_helpers for url_for methods Rails.application.routes.default_url_options[:host] = 'localhost' Rails.application.routes.default_url_options[:port] = 3000 この状態でicatch_urlメソッドの返り値をコンソールで確認してみます。 まずは適当な画像を添付したレコードを生成してください。 $ mkdir db/seed_data $ mv 適当な画像 db/seed_data $ rails c $ post = Post.first $ post.icatch.attach(io: File.open(Rails.root + 'db/seed_data/適当な画像'), filename: '適当な画像') # 後ほど使うのでsaveします $ post.save! $ Post.first.icatch_url => "http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--59a7d22bb43b6ee92bcb55321a0b1a2b1c622cdd/適当な画像" 上記のような返り値が返ればOKです。 フロントにicatch_urlを返却するために、app/views/_post.json.jbuilderに以下を追加してください。 json.extract! post, :id, :title, :body, :created_at, :icatch_url # 追加 保存できる拡張子の制限を設定 今のままだとどんな拡張子のファイルでも保存ができてしまうので、保存できる拡張子を制限できるGemを導入します。 # In Your Gemfile gem 'activestorage-validator' $ bundle install ActiveStorageにはvalidationの機能がデフォルトで備わっていないため、上記のGemを用いています。 app/models/post.rbに以下を追加してください。 validates :icatch, blob: { content_type: ['image/png', 'image/jpg', 'image/jpeg',]} content_typeにMIME-TYPEを指定することでバリデーションが可能になります。 投稿画面コンポーネントの修正 ここからVue.js側の修正を行なっていきます。 formDataオブジェクトを用いた画像投稿 画像の投稿を行うためにJavaScriptのFormDataオブジェクトを用います。 src/views/NewPost.vueを以下のように編集してください。 <template> <div class="flex items-center h-screen w-full bg-teal-lighter"> <div class="w-full bg-white rounded shadow-lg p-8 m-4"> <h1 class="block w-full text-center text-grey-darkest mb-6">New Post</h1> <div class="flex flex-col mb-4"> <label class="mb-2 font-bold text-lg text-grey-darkest" for="title">Title</label> <input v-model='title' class="border py-2 px-3 text-grey-darkest" type="text" name="first_name" id="first_name"> </div> <div class="flex flex-col mb-4"> <label class="mb-2 font-bold text-lg text-grey-darkest" for="body">Body</label> <textarea v-model='body' class="border py-2 px-3 text-grey-darkest" name="body" id="body"></textarea> </div> <div class="flex flex-col mb-4"> <label class="mb-2 font-bold text-lg text-grey-darkest" for="icatch">iCatch</label> <input @change="setIcatch($event)" class="border py-2 px-3 text-grey-darkest" type="file"> </div> <button @click='handleCreatePost()' class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 uppercase text-lg mx-auto rounded" type="submit">Create Post</button> </div> </div> </template> <script lang="ts"> import { createPost } from '@/api/post' import router from '@/router' import { defineComponent, reactive, toRefs } from 'vue' export default defineComponent({ name: 'NewPost', setup () { const postData = reactive({ title: '', body: '' }) const formData = new FormData() const setIcatch = (e: Event) => { e.preventDefault() if (e.target instanceof HTMLInputElement && e.target.files) { formData.append('icatch', e.target.files[0]) } } return { ...toRefs(postData), setIcatch, handleCreatePost: async () => { formData.append('title', postData.title) formData.append('body', postData.body) await createPost(formData) .then(() => { router.push('/posts') }) } } } }) </script> ファイル選択イベントがあった場合にsetIcatch関数を呼び出すようにして、formDataオブジェクトにアップロードされた画像を入れるようにしています。 <input @change="setIcatch($event)" class="border py-2 px-3 text-grey-darkest" type="file"> このままではcreatePost関数を叩くときに例外が起きてしまいますので、修正します。 投稿APIに渡す引数の修正 src/api/post.tsを以下のように修正します。 import Client from '@/api/client' import { getAuthDataFromStorage, getAuthDataFromStorageWithFormData } from '@/utils/auth-data' export const getPosts = async () => { return await Client.get('/posts', { headers: getAuthDataFromStorage() }) .then((response) => { return response.data }) .catch((err) => { console.log(err) }) } export const getPost = async (id: string) => { return await Client.get(`/posts/${id}`, { headers: getAuthDataFromStorage }) .then((response) => { return response.data }) } export const createPost = async (formData: any) => { return await Client.post( '/posts', formData, { headers: getAuthDataFromStorageWithFormData() } ) .then((response) => { return response.data }) } formData型の値を扱うため、postForRequest型は削除していきます。 // src/types/post.ts export type Post = { title: string; body: string; userName: string; createdAt: string; icatchUrl: string; // 追加 } // 以下を削除 export type PostForRequest = Pick<Post, 'title' | 'body'> // src/api/post.ts import Client from '@/api/client' // PostForRequestを削除 import { Post } from '@/types/post' // PostForRequest型からFormData型に修正 export const createPost = async (formData: FormData) => { return await Client.post( '/posts', formData, { headers: getAuthDataFromStorage() } ) .then((res: AxiosResponse<Post>) => { return res.data }) } multipart/form-data形式でデータ送信を行うために、src/utils/auth-data.tsに以下の関数を追加します。 export const getAuthDataFromStorageWithFormData = (): AuthHeaders => { return { 'access-token': localStorage.getItem('access-token'), client: localStorage.getItem('client'), expiry: localStorage.getItem('expiry'), uid: localStorage.getItem('uid'), 'Content-Type': 'multipart/form-data' } } getAuthDataFromStorageとの違いは、Content-Typeに指定する項目がapplication/jsonではなく、multipart/form-dataとしている点です。 画像を投稿する場合には getAuthDataFromStorageWithFormData 関数の方を用いるようにします。 投稿一覧コンポーネントの修正 最後に画像を表示するように修正を行います。 // src/components/AppPost.vue <template> <div class="rounded overflow-hidden shadow-lg pt-8 mr-8"> <img :src="post.icatch_url"> <div class="font-bold text-xl mb-2">{{post.title}}</div> <p class="text-grey-darker text-base"> {{ post.body }} </p> </div> </template> <script lang="ts"> import { Post } from '@/types/post' import { defineComponent, PropType } from 'vue' export default defineComponent({ name: 'AppPost', props: { post: { type: Object as PropType<Post>, required: true } } }) </script> <style scoped> </style> この状態で一通り動作確認を行なってみます。 ログインした後、 http://localhost:8080/posts に アクセスして、先ほどsave!した画像が表示されていれば問題なく動作しているかと思います。 投稿機能も試してみましょう。 画像のリサイズやレイアウト等が未完成ですが、最低限の画像アップロード & 表示機能ができたかと思います。 まとめ 次回はユーザー登録機能を実装する予定です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on rails の deviseでユーザー機能を実装

オリジナルアプリをつくる時に、deviseでユーザー管理機能を実装しようとしたら、 エラーだしたりと、つまずいてしまったので勉強ようにまとめようと思います。 ライブラリをインストールしよう gem.fileの最後の行に gem 'devise' を記述 bundle install でgemをinstall 設定ファイルを作成しましょう ターミナルで rails g devise:install deviseのUserモデルを作成しよう 注意するのが、deviseを介してのuserモデルは rails g model userではないことです。 以下のコマンドになるので注意しましょう。 rails g devise user ユーザーに関する、モデルやマイグレーションも自動生成されています。 また、routes.rbに以下のルーティングが自動的に追記されます。 config/routes.rb Rails.application.routes.draw do devise_for :users root to: 'tweets#index' resources :tweets end テーブルを作成しよう 先ほど自動生成されたマイグレーションファイルを使用して、テーブルを作成します。 # frozen_string_literal: true class DeviseCreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" t.string :nickname , null: false t.string :family_name , null: false t.string :fist_name , null: false t.string :family_name_kana , null: false t.string :fist_name_kana , null: false t.date :birthdate , null: false ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at そして、こちらを実行 rails db:migrate deviseのビューファイルを作成しよう このコマンドで作成できます。 rails g devise:views deviseはデフォルトでは、パスワードとmeilしかありません。 他を追加した場合は、ビューファイルも編集します。 カラムを追加した場合、ストロングパロメーターをつかって追加したカラムも保存許可をします。 しかし、deviseにストロングパラメーターを追加するコードは、deviseのコントローラーが編集できないため、application_controller.rbに記述します。 class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :family_name, :fist_name, :family_name_kana, :fist_name_kana, :birthdate]) end end そして、バリデーションはモデルに記述します。 class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable with_options presence: true do validates :nickname with_options format: { with: /\A([ぁ-んァ-ン一-龥]|ー)+\z/ } do validates :family_name validates :fist_name end with_options format: { with: /\A([ァ-ン]|ー)+\z/ } do validates :family_name_kana validates :fist_name_kana end validates :birthdate end VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze validates :password, format: { with: VALID_PASSWORD_REGEX } end 一応これでユーザー登録はできるはず・・ 番外編 エラーがでて、一応やってみたら解決したので残しておこうと思いました。 rails db:migrate をしたら、下の上の部分のエラーがでました。 マイグレーションファイルをみたら、記述が間違えてまして直して再度やっても同じエラーがでてしまいました。 ど〜したものかと考えて rails db:migrate:reset をして、SequelProで確認してもできていなく悩んでたのですが・・・ 単にSequelProの更新の仕方が違っており、更新したらできておりました。 rails aborted! ActiveRecord::NoDatabaseError: Unknown database 'photzoo_35_development' /Users/nakamatsumayumi/projects/photzoo-35/bin/rails:9:in `<top (required)>' /Users/nakamatsumayumi/projects/photzoo-35/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Caused by: Mysql2::Error: Unknown database 'photzoo_35_development' /Users/nakamatsumayumi/projects/photzoo-35/bin/rails:9:in `<top (required)>' /Users/nakamatsumayumi/projects/photzoo-35/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace) nakamatsumayumi@nakamatuminoMBP photzoo-35 % rails db:migrate:reset Database 'photzoo_35_development' does not exist Database 'photzoo_35_test' does not exist Created database 'photzoo_35_development' Created database 'photzoo_35_test' == 20210427033446 DeviseCreateUsers: migrating ================================ -- create_table(:users) -> 0.0325s -- add_index(:users, :email, {:unique=>true}) -> 0.0305s -- add_index(:users, :reset_password_token, {:unique=>true}) -> 0.0279s == 20210427033446 DeviseCreateUsers: migrated (0.0910s) ======================= これで、3時間もかかったのでまた、出くわした時のために残しておきます!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

面接での技術質問

面接での技術質問 面接で聞かれた技術質問に対し、しっかりと答えられなかったので戒めとして記事にします。 本当に基本的なことなので、これを機にもっとRuby on Railsの中身をもっと詳しく学習しようと思います。 MVCモデル ActiveRecord ・ActiveRecordとはMVCのM、つまりModelに関する部分 ・RubyのオブジェクトをSQLに翻訳してRDBMSの操作できるツール ・Railsとデータベースを接続する役割を担います M=Model ・データベースとの接続とデータに関する操作を行う  V=View ・Modelの内容を参照し、webアプリケーションの見た目の部分を表現する C=Controller ・リクエストに対応する処理をまとめ、リクエストを受け取って処理を行った後、クライアントにレスポンスを返す。 オブジェクト指向 オブジェクト指向プログラミングとは、「もの」を組み立てる様に表現してコンピュータに指示することです。 機能・役割ごとに分けて、実装を進めていく方針のことを言います。 主なメリットとしては2点。 役割ごとにオブジェクトを分けることで、実装がしやすくなる 役割ごとに分けるため、後からコード変更がしやすい、また他のコードに影響が出にくい そして「もの」を組み立てる際の設計図を「クラス」と呼び、その「設計図から作成された実物体」のことを「インスタンス」と呼びます。 HTTPリクエストについて 何らかのwebサービスにアクセスする時を例にとって説明します。 1.まずクライアント側のPCでブラウザにURLを入力します。 2.クライアント側のPCからWebサーバーに「HTTPリクエスト」を送信します。 3.Webサーバーが、「HTTPリクエスト」に対応する「HTTPレスポンス」をクライアント側のPCに送信します。 4.クライアント側のPCでWebページを表示します。 少し細かく説明すると、 リクエストを送る際、DNSサーバーにアクセスし、webサイトのIPアドレスを特定、そのIPアドレスを持つサーバーに対してHTTPリクエストを送信します。 サーバーがそのHTTPリクエストを元にクライアントの要求を承認すると、サーバーはクライアントにHTTPステータスコード200を返します。 承認が行われると、サーバーからwebサイトの情報がデータパケットという形で転送され、クライアント側にwebサイトが表示されます。 クッキーとセッション Cookieとは、Webサイトの提供者が、Webブラウザを通じて訪問者のコンピュータに一時的にデータを書き込んで保存させる仕組み。 sessionとは、クライアントとサーバーの通信状態のことで、sessionにはIDを割り振られて管理される。 ログイン状態を保持したページ遷移などは、クッキー、セッションが使われています。 クライアント側にあるクッキーの情報とサーバー側に保存されているセッションIDが一致していれば、ログイン状態を保持したまま画面遷移が可能になります。 ロードバウンサー(負荷分散装置)とは ロードバウンサーとは、名前の通り、サーバーにかかる負担を分散させる仕組みです。 Webサイトへのアクセス集中やサーバーが故障してしまったても、アクセス中の利用者に安定したサービス提供を継続可能になります。 クライアントとサーバーの間に取り入れられる仕組みで、クライアントからのHTTPリクエストがあると、ロードバウンサーを経由し、その後負荷が集中しないように各サーバーへ振り分けられます。 ロードバウンサーの役割は主な役割は、 アクセス集中による速度低下を防ぐ 不具合が起きているサーバーへはリクエストを送らない サービスを停止することなくサーバーのメンテナンスが可能 特定のユーザーのアクセスを同じサーバーへ送る find、find_by、where句 findメソッドは、各モデルのidを検索キーとしてデータを取得するメソッド find_byメソッドは、各モデルのid以外の条件で検索するメソッド whereメソッドは、各モデルをid以外の条件で検索する場合該当するデータ全てが返ってくるメソッド renderとredirect_to renderメソッドは、viewファイルを指定 redirect_toは、URL(HTTPリクエストメソッド)を指定 よく似た挙動をしますが、処理の中身が大きく異なります。 renderメソッドではcontrollerからviewファイルを指定して表示されます。 一方でredirect_toは、MVCを経由した処理が行われます。 controller → URL → routes → controller → view の流れです。 そのため以下のような使い分けが可能です。 render:エラー発生時などに、単にエラーページなどを表示させる場合 redirect_to:データ更新、削除などcontrollerの処理が必要な場合
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

返信機能を実装する

返信機能仕様 ・返信先は@ID-usernameで本文のなかで指定する。(例、IDが1、User名が『suzu』だった場合、@1-suzuとなる。) ・返信は投稿者と返信先のユーザーのフィードのみ表示される。 ・自分に対しての返信はできない。 ・指定したIDが存在しない場合、投稿時にエラーが出る。 ・指定したIDとそのIDのユーザー名が一致しない場合、投稿時にエラーとする。 実装 ・micropostsへのカラムを追加する。 ・各投稿に返信先のユーザーを指定するためのカラムが必要になるので追加する。 #実行 rails g migration AddInReplyToToMicropost ・以下の変更を加える。 class AddInReplyToToMicropost < ActiveRecord::Migration[6.1] def change add_column :microposts, :in_reply_to, :string, default: "" end add_index :microposts,[:user_id, :created_at] end ・micropostsにin_reply_to属性を追加する。 ・in_reply_toには返信先のユーザーのIDを格納するためIntegerとし、デフォルトを0とします。そのため、返信先が指定されていない場合、in_reply_toは0になります。 ・さらにindexを追加し、DBにマイグレートします。 ・micropostクラスにscope(including_replies)を追加する。 ・scopeを記述する前に、追加したscopeを利用した新しいfeedメソッドの処理を記載する。 app/models/user.rb def feed following_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id" Micropost.including_replies(id) .where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id) end ・scopeの後にwhereで今までのfeedの処理に繋げられるようにscopeを定義する。 ・上で設定した仕様を満たすためには、in_reply_toが0または自分のIDである(返信先の指定がないor返信先が自分)user_idが自分のIDである(自分が投稿者)のどちらか出なければいけません。 scopeではなくクラスメソッドで定義するようにします。 app/models/micropost.rb def Micropost.including_replies(id) where(in_reply_to: [id,0]).or(Micropost.where(user_id:id)) end ・ユーザーのフィードに出す準備はできたので、本文から返信先を取得する処理を実装します。 app/models/micropost.rb before_validation :set_in_reply_to #ここを追加 belongs_to :user default_scope -> { order(created_at: :desc) } validates :user_id,presence: true validates :content,presence: true,length:{ maximum: 300} validates :in_reply_to,presence: false #ここを追加 validate :picture_size, :reply_to_user #ここを追加 ・どのタイミングで返信先を取得しどのタイミングで返信先の内容をチェックするかを決めます。 ・チェックは通常のvalidateで指定し、返信先の取得はvalidationが走る前にbefore_validationのコールバックで実施することにしました。 ・set_in_reply_toで本文から返信先を抜き出し、reply_to_userでチェックをします。 ・:presenceをfalseに設定しています。 ・set_in_reply_toを実装していきます。 app/models/micropost.rb def set_in_reply_to if @index = content.index('@') reply_id = [] while is_i?(content[@index+1]) @index += 1 reply_id << content[@index] end self.in_reply_to = reply_id.join.to_i else self.in_reply_to = 0 end end ・本文中の@を探し、その位置から数字が続くだけ文字を取得し、最後に連結&integerにキャストします。 ・indexを@indexとインスタンス変数にしているのは、バリデーションの際にも子のindexを利用するためです。 ・数値のチェックに利用しているis_i?の実装は以下のとおりです。 app/models/micropost.rb def is_i?(s) Integer(s) != nil rescue false end ・返信先のユーザーIDの取得ができたのでバリデーションを実装します。 app/models/micropost.rb def reply_to_user #返信先が指定されてない場合、チェックをしない。 return if self.in_reply_to == 0 #指定したIDユーザーが見つからなかった場合エラーにする。 unless user = User.find_by(id: self.in_reply_to) errors.add(:base,"指定したユーザーIDが存在しません。") else #自分自身に返信を行った場合エラーにする if user_id == self.in_reply_to errors.add(:base,"自分に返信する事はできません。") else #指定したIDのユーザー名が間違っていた場合エラーにする unless reply_to_user_name_correct?(user) errors.add(:base,"ユーザーIDその名前と一致しません。") end end end end ・エラーメッセージ追加時に指定している:baseは、エラーメッセージを表示する際に属性名を表示しないようにできています。 app/models/micropost.rb def reply_to_user_name_correct?(user) user_name = user.name.gusb(" ","-") content[@index+2,user_name.length] == user_name end ・指定されたIDのユーザー名を取得して、空白を『-」で埋めています。 ・先ほど取得した@indexを2つ進めて、実際のユーザー名の長さだけ本文を抜き出し、比較しています。 ・以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git で公開してはいけないものを公開してしまい、リモートリポジトリを消した話

はじめに プログラミング初学者のため、自分の理解できている範囲内で言語化しています。 何か間違っている情報や改善点などありましたら、コメントいただけますと幸いです。?‍♂️ 何が起きたのか 簡単にまとめると、ブランチきって作業していた際に、公開してはいけない情報を記述したまま、 コミット → プルリクエスト → マージ → ブランチ削除 まで気づかずにしてしまっていた。 原因 圧倒的gitの知識不足 学んだこと 公開したくない情報を記述したまま、コミットしてはいけない。 ブランチは削除しても見れてしまうため、実質消せていない。 *最悪コミット・プルリクエストまでは簡単に戻せるっぽいが、マージからブランチまで削除してしまう消すことはできない 間違えてコミット・プルリクエストをしてしまったときに、解決する方法はたくさんあるので 調べる? 特にこの方が丁寧にまとめてくださってる、本当に助かります?‍♂️ URL:https://qiita.com/muran001/items/dea2bbbaea1260098051#%E3%82%84%E3%82%89%E3%81%8B%E3%81%97%EF%BC%93%E4%BD%99%E8%A8%88%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%97%E3%81%9F%E3%81%91%E3%81%A9%E3%82%84%E3%81%A3%E3%81%B1ignore%E3%81%97%E3%81%9F%E3%81%84%E6%99%82 試したこと 結論、私の場合はマージしてブランチの削除まで進んでしまっていたので、消すことができずリモートリポジトリごと削除した、、、? やったこと → ターミナル. % git reset --soft コミットID で公開したくない情報を記述したコミットまで戻し、履歴を上書きした これでリモートリポジトリの<>codeでは表示されなくなったので 一見これで成功したように見えたが、リモートリポジトリのPull requestsのclosedに削除したブランチが残っていて、ここで変更履歴を見ることができた。 ここで、ブランチは完全に消すことができないことを知り、リモートリポジトリを削除することにしました。 リモートリポジトリの削除 リモートの設定の一番したの方に削除するためのボタンがあり、そこで削除する。 削除した後は、ローカルの方でもリモートの情報を削除する必要がある ターミナル. xxxxxnoMacBook-Pro testapp % git remote        ---リモートの情報があるか確認 origin                            ---originという情報が残っている xxxxxnoMacBook-Pro testapp % git remote rm origin  ---originの削除 xxxxxnoMacBook-Pro testapp % git remote        ---リモートの情報があるか確認 xxxxxnoMacBook-Pro testapp %               ---ない場合は何も出ない これでローカルでのリモートリポジトリの削除は完了 最後に、またアプリケーションをgitに追加して完了
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RSpec 基本構文の理解

【RSpec 基本構文の理解】 RSpecの構文に全然慣れないので超基本から復習しました。 簡単な自分用の備忘録です。 RSpecの書き方 ・テストケースを整理、分類 : describe, context ・テストコードを実行 : before, it RSpec.describe ['テストの対象'], type: ['Specの種類'] do describe ['テストの対象'] do context ['どんな条件でテストをするか'] do before do ['事前の準備'] end it ['仕様の内容 : テストで期待する正常な概要'] do ['テストで期待する正常な動作'] end end end end itが1番肝心。 最終的にitに書かれた状態になればテストは正常におこなわれたということ。 itに到達するまでに、describeやcontextを何個もネストすることができる。 内側のdescribeやcontextやitを複数記述することもできる。 ※type指定は、外側のdescribeにだけおこなうことができる。 Specを実行 rspecコマンドにSpecファイルの場所を指定して、実行する。 $ bundle exec rspec spec/system/example_spec.rb 問題無く、テストが実行されると、 1 example, 0 failures 表示される。  → 1件のテストを実行して、失敗が0件で問題無く、テストが通った。(今回は1件のみ)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsで検索機能を実装する(Gemなし)

検索機能を実装したので備忘録 1.controllerへ処理を記載 /app/controllers/users/team_controller.rb def search @teams = Admin.search(params[:search]) #@teamsは好きなものを入力して、Adminの部分には検索したいテーブル名を入力する end 検索欄に入力された内容をモデルに渡すための処理 2.modelへsearchメソッドを定義 /app/models/admin.rb def self.search(search) if search Admin.where(['address LIKE ?', "%#{search}%"]) #Adminには検索したいテーブル、addressには検索したいカラム名を入力する else Admin.all #検索結果が当てはまらない場合は全て表示させる(必要ない場合は削除する) end end 3.routingを設定 /config/routes.rb get 'teams/search', to: 'teams#search' 必要であれば設定 4.viewへform_tagを記載する /app/views/users/teams/index.html.erb <%= form_tag(teams_search_path,:method => 'get') do %> <%= label_tag '地域で検索' %> <%= text_field_tag :search %> <%= submit_tag 'Search', :address => nil %> <% end %> この記述を検索機能を付けたいviewへ記述することで検索が可能になる 5.search後のviewを作成 こちらに関しては検索前の一覧画面とほとんど同じで問題ないかと思う。 今作ってるものだとこんな感じ。 /app/views/users/teams/search.html.erb <h2>チーム一覧</h2> <table class="table table-striped bg-light"> <thead> <tr> <th>チーム</th> <th>活動場所</th> <th>メールアドレス</th> <th>ジャンル</th> </tr> </thead> <tbody> <% @teams.each do |team| %> <tr> <td><%= link_to team.team_name, team_path(team) %></td> <td><%= team.address %></td> <td><%= team.email %></td> <td><%= team.genre %></td> </tr> <% end %> </tbody> </table> 以上で検索機能の実装完了。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSアクセスキーを流出してしまった時の対処法について

出来事 先日誤って、AWSのアクセスキーをGithubにあげてしまいました。調べていくうちに、これはとんでもないことをしてしまったと思い、急いで対処しようとしましたが、焦りもあって何もできず。何かプロのエンジニアに電話か何かで対応してもらえるアプリはないか探していたところ、「ココナラ」というアプリを発見。急ぎ、エンジニアに対応してもらいました。 AWSアクセスキーをGitHubにあげてしまった時の対処方法 AWSアクセスキーを含むコミットを削除し、AWSアクセスキーを保存した履歴を削除することが適切な対処方法です。具体的には、Git rebase機能、又はGit commitのamendオプションを利用することで履歴を削除することが可能です。 ◆まず初めにやること AWSを無効化する。 AWSアクセスキーを無効化した場合は、セキュリティ上の問題は発生しませんのでご安心ください。AWSアクセスキー(恐らくIAM userのAccess KeyとAccess Secret Key)は、無効にしたりSecretを更新することで既存Credentialは使用不可となるためです。ですので、原理上アクセスキーをコードから削除したり履歴上から抹消しなくても、攻撃が発生することはありません。 …ただし、やはりCredentialがコード履歴に残っていることは印象が悪いため、削除したほうが良いですよね、、、 ◆どのように防ぐか 「ブランチ戦略」です。 ブランチの位置づけとして「main」はテスト・コードレビューが完了したコード、「その他(devなど)」は消えたりrebaseされたりする可能性のあるコードとして分けておきます。そうすることで、ミスしたPushでもリカバーできる簡易性を担保させることができます。 この手法は開発メンバーが増えていけばいくほど有効になってきます。 (勝手にコミットを結合したり消したりするのはマズイので…) ◆rebaseとamendの使い分け amendは、直前のコミットを修正することが可能でして、この方法を用いるのが一番簡単です。 ただし、この方法は「直前のコミットを修正したい」場合にのみ有効です。rebaseは、修正したいコミットをどこでも修正することが可能です。ただし、rebaseコマンド自体が様々な機能を持っているので、コマンドの使いやすさでは劣ります。 ◆amendで修正する手順 以下の手順で修正が可能となります。 1. ローカル環境のソースコードを修正 2. コマンド "git add ." を実行 3. コマンド "git commit --amend" を実行 4. 直前のコミットのコミットメッセージがエディタで表示されます 5. 必要に応じてコメントを修正し保存 6. git pushコマンドを再実行(既にPushしたコミットを上書きするため、-fオプションが必要)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「Rails」bundle installでAn error occurred while installing mimemagic (0.3.10), and Bundler cannot continue.の対処法

エラー文章 An error occurred while installing mimemagic (0.3.10), and Bundler cannot continue. Make sure thatgem install mimemagic -v '0.3.10' --source 'https://rubygems.org/'` succeeds before bundling.` 遡るとこんなことが書いてある Fetching mimemagic 0.3.10 Installing mimemagic 0.3.10 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. shared-mime-infoをインストールする brew install shared-mime-info bundle installをする bundle install mimemagicがアップデートされて無事エラーが無くなる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]whereとfindの違いについて

はじめに 公式ドキュメントを見ながら、黙々と開発をしている中で、whereとfindの違いについて危険な勘違いをしていたのでここで共有します。 私の勘違い 私はこれまで、whereとfindの違いを、条件に一致したオブジェクトを複数返すか、1個返すかの違いでしかありませんでした。しかし、先日以下のようなコードを書いた時にうまく動かなくて、、、、じつは上述の考え方は50点でした @game=Game.where(id:3) #1個だけしか当てはまらない puts"#{@game.name}" #だからこんな感じでと!って動かない 正しい考え方 私の考えに足りなかったのは、どう返ってくるかという点です。whereが条件に一致した複数のオブジェクトを返すというのは正しいのですが、実は配列として返ってくるのです。つまり上記のコードを動かそうとするのであれば、以下のような形にしなければなりません。 game=Game.where(id:3)  @first_game=game.first #配列で返ってきた物から、1つ目の要素を取得 puts"#{@first_game.name}"  終わりに こうした基礎の奥を見ていくことは本当に重要ですね。わかったふりして使っていても、いずれエラーにぶち当たるかと思うので、基礎の深掘りをすることをお勧めします!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

wheneverコマンド

wheneverコマンドメモ cd /path/to/root_dir # リセット bundle exec whenever --clear-crontab --set environment=local # 時間返るとか vim config/schedule.rb # セット、更新 bundle exec whenever --set environment=local bundle exec whenever --update-crontab --set environment=local # 確認とか crontab -l tail -f log/* # 時刻のチェック date -u "+%Y-%m-%d-%H-%M-%S"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rspec入門

Rspec入門してみよう 本記事はRspecの勉強を始めて一日目の若造が書く記事なので、間違っているところがあったら教えてください!!!!! そもそもRspecって何? Rspec(アールスペック)は,RubyやRuby on Railsの代表的なテストツールのことで、クラスメソッド単位でテストするために使用するものです。 そもそもテストを書く意味とはなんぞや?? ※以下抜粋 1.安全ネットとしての役割 テストコードはアプリケーションの安全ネット、命綱、防弾チョッキ 機能を追加・変更しても、他の部分が壊れていないことを保証する RubyやRails,gemをアップデートしても壊れていないことを保証する なぜテストを書くのか 大規模なプログラムを毎回作業で再テストするのは非現実的だから プログラムが壊れると顧客や利用者に迷惑がかかるから 今後も長く運用される見込みが高いから 2.実装の正しさを証明する役割 実装した要件を満たしていることや、仕様通りに動くことを検証する テストがパスされれば、自信をもってリリースすることができる なぜテストを書くのか? 顧客や利用者に対して不具合がないことを担保する必要があるから 人間と違って自動テストは疲れたり、見間違いをしないから 参考文献 https://speakerdeck.com/jnchito/number-tamarubykaigi01 ↑この記事はすごくわかりやすかったので是非見てください!! 以上テストを書く理由とRspecとはなんぞや??っていう記事でした 明日以降Rspecの構文について触れていきたいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

curlコマンドは、出来ることがたくさんなのですね!

はじめに たまに見かける「curl」コマンド。 名前からも、何をするものか想像も出来ず、特に使うこともなく今現在まで至っていました。 しかし、とうとうcurlの壁にぶち当たりました!笑 そこで、どういったことが出来るかを調べたので、備忘録も兼ねて自分と同じ状況の人の手助けになれたらと思います! curlコマンドとは? curlコマンドとはサーバから、もしくはサーバへデータ転送を行うコマンドのことです。 httpリクエストができるコマンドなイメージではありますが、APIを叩いたりすることができるというだけで、HTTPのGETやPOSTはもちろん、HTTPSやFTP, Telnet, SMTP, IMAP, POP3など様々な通信プロトコルをサポートしています。 ※ちなみにcURLとは、【client for URL】という意味らしいです! jqコマンドについて jqコマンドは入力を受け取り、出力を生成するフィルタの役割を果たします。 特定のデータを抽出したり整形したりできるのですが、今回は整形して見やすくするためだけに使用します。 ※JSON形式のみ対応可能です。 インストールはhomebrewで出来ます。 $ brew install jq 基本的な使い方 curlコマンドの基本形は下記の通りです。 curl [options] [URL] GETリクエスト GETリクエストの場合は、特に何も指定せずURLを打ち込むだけで大丈夫です。 $ curl localhost:3000/api/json | jq . GET以外のリクエストの場合 明示的にリクエストメソッドを指定したい場合は-X リクエストメソッド "URL"で変更することができます。 $ curl -X POST "localhost:3000/api/json" | jq . ファイルに出力したい場合 -o オプションを指定することでファイルに出力できます。 # $ curl URL -o 出力したいファイル名 $ curl localhost:3000/api/json -o response コンソールの出力をカスタマイズしたい場合 -# オプションを使うと、プログレスバーのような表記に変更できます。 $ curl localhost:3000/api/json -o response -# ######################################################################## 100.0% -sオプションで、プログレス情報を非表示にできる。 # Portを間違えているが、-sはエラーメッセージもでない $ curl -s localhost:3001/api/json | jq . # -Sをつけることで、エラーメッセージが出力される。 $ curl -Ss localhost:3001/api/json | jq . #=> curl: (7) Failed to connect to localhost port 3001: 接続を拒否されました ヘッダーを確認したい場合 -Iオプションで、Headerのみ取得し、出力することができます。 $ curl -I -s 'localhost:3000/api/json?' | jq . HTTP/1.1 200 OK . . . -i ならば、Response Header,Bodyの両方を出力できます。 $ curl -i -s 'localhost:3000/api/json?' | jq . HTTP/1.1 200 OK . . . { ... } ヘッダーを変更したい場合 -H “パラメータ: “値” をつけることで、HTTPヘッダを追加することができます。 $ curl -X POST "localhost:3000/api/json" -H "accept: application/json" | jq . パラメーターを送信したい場合 ‘{“パラメータ”}: {“値”}’でパラメーターを送信できます。 $ curl -X POST -d '{"hoge1":"fuga1", "hoge2":"fuga2"}' "localhost:3000/api/json" パラメータ付きPOSTとURLエンコード --data-urlencode を使うと、curlがURLエンコードしてくれるので、そのまま書いてしまうことができます。 # URLエンコードはcurlに任せてPOST $ curl -w '\n' 'http://localhost:8080/job/sample/configSubmit' --data-urlencode 'json={"properties": {"hudson-model-ParametersDefinitionProperty": {"parameterized": {"parameter": {"name": "FileParameter", "description": "Upload file to Jenkins.", "stapler-class": "hudson.model.FileParameterDefinition", "$class": "hudson.model.FileParameterDefinition"}}}}}' -d 'Submit=Save' -XPOST ファイルをUploadするPOST --form もしくは -Fを使用することで、ファイルをUploadできる。 # Upload用ファイルを用意 $ echo "Sample file" > sample.txt # Fileパラメータにsample.txtを指定してビルド実行 $ curl -sS 'http://localhost:8080/job/sample/build' -X POST -F "file=@sample.txt" -F 'json={"parameter": [{"name":"FileParameter", "file":"file"}]}' HTTP通信の詳細を出力を確認したい場合 -vオプションを付与することで、HTTP通信の詳細を出力することが出来ます。 $ curl -v -X POST -d'{"hoge1":"fuga1", "hoge2":"fuga2"}' "localhost:3000/api/json" エラーコードを確認したい場合 -fオプションを付与することで、異常終了時に、終了コードで終わってくれます。 $ curl -f -X POST "localhost:3000/api/jsonstatus/404" #=> curl: (22) The requested URL returned error: 404 NOT FOUND おわりに curlコマンドはシンプルかと思いきや、出来ることがありすぎて複雑でした。。 しかし、基本的な使い方はシンプルなので、使っていくうちに慣れていくかもしれないですね! 参考 curlコマンドでちょこっとHTTPリクエストを試すだけの記事 curl コマンド 使い方メモ curl コマンド
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails] マイグレーションファイルをUPの状態で消した際の対処法

記事の内容 マイグレーションファイルがUPの状態で誤って消してしまい、migrateするとerrorが出てしまう。そんな時の対処法をお伝えします。 前提 Ruby:2.6.5 Rails 6.0.0 MySql 流れ 1.rails db:migrate:statusで消してしまったファイルの確認、コピーする。 2.dbに手動でファイルを作成する。 3.rails db:rollbackでdownにし、手動でファイルを消す。 1.rails db:migrate:statusで消してしまったファイルの確認 ターミナルでrails db:migrate:statusとコマンド、消してしまったファイル名を確認 ターミナル. Status Migration ID Migration Name -------------------------------------------------- up 20210416062030 Devise create users up 20210421093836 Create photos up 20210421095230 Create active storage tablesactive storage up 20210422031359 Create areas up 20210427013219 Nofile         ↑こちらの数字をコピーする 2.dbに手動でファイルを作成する。 db内に手動でファイルを作成します。 db/20210427013219_sample.rb←sampleの部分は任意のファイル名で大丈夫です。 class Sample < ActiveRecord::Migration[6.0] def change end end 3.rails db:rollbackでdownにし、消す。 ターミナルでrails db:rollbackをコマンドし、後はファイルをゴミ箱に入れれば完了。 ターミナル. Status Migration ID Migration Name -------------------------------------------------- up 20210416062030 Devise create users up 20210421093836 Create photos up 20210421095230 Create active storage tablesactive storage up 20210422031359 Create areas down 20210427013219 Sample   ↑downしていることを確認し、手動で削除すれば完了です。 まとめ githubで編集内容を削除し、誤ってマイグレーションも消してしまう場面が多々あります。この記事を参考にerrorを解決していただけたら幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Rails ローカル環境構築 詰まったのでメモ

記事を書いたきっかけ Railsチュートリアルが一段落したのでローカルの環境開発を構築しようとしたところ、詰まりまくったのでメモ。 2021.4.26 Monday Ruby on Railsの環境構築をしてみよう!(macOS)を参考にした https://prog-8.com/docs/rails-env Rubyのバージョン確認 rbenv versions -bash: rbenv: command not found まだRubyの開発環境が整ってないので、先にRubyをインストールする。 Rubyの開発環境を用意しよう! https://prog-8.com/docs/ruby-env Rubyがインストールされていることを確認 ruby -v ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19] デクストップ上にフォルダ「ruby_lesson」を開き、その中に「index.rb」ファイルを作成する。 index.rbにかきコードを記述する。 puts "Hello, World!" puts 1 + 2 このコードの実行結果を確認するため、エディタ上でNew Terminalを開く。 index.rbを実行するため、 ruby index.rb をターミナルで実行する。 ターミナル上に Hello, World! 3 を表示される。 これで自分のPCでRubyのコードを書き、実行する環境が整えられた。 これでも問題ないが、実際の開発現場では、複数のRubyのバージョンを用いることがしばしばあり、「rbenv」というツールを用いてRubyをインストールすることが一般的。 Homebrewのインストール 「Homebrew」をインストールする 「Homebrew」を用いて「rbenv」をインストールする 「rbenv」を用いてRubyをインストールする まずはHomebrewのインストールから始める。 ターミナルで以下のコマンドを実行する。 brew -v Homebrew 2.6.2 Homebrew/homebrew-core (git revision 842bf; last commit 2020-12-19) Homebrewがインストールされていたので、rbenvのインストールに進む。 rbenvのインストール Homebrewを用いてrbenvをインストールする。 まずrbenvがインストールされていないことを確認するため、以下のコマンドを実行する。 rbenv -v -bash: rbenv: command not found まだrbenvがインストールされていないので、以下のコマンドをターミナルで実行して、rbenvをインストールする。 brew install rbenv ruby-build 以下のコマンドを実行して、rbenvがインストールできたことを確認する。 rbenv -v rbenv 1.1.2 これでOK。 次の章でrbenvを使用してRubyをインストールするが、その前に実行環境を確認し、インストールしたrbenveの設定をしておく。 以下のコマンドを実行する。 echo $SHELL /bin/bash 実行結果が/bin/bashの場合、以下のコマンドを実行する。 echo 'eval "$(rbenv init -)"' >> ~/.bash_profile source ~/.bash_profile これでrbenvの設定は完了! Rubyのインストール 最後に、インストールしたrbenvを用いてRubyをインストールする。 rbenvでは複数のバージョンのRubyを使用できる。 どのバージョンのRubyがインストールできるか確認するため、以下のコマンドを実行する。 rbenv install --list 2.6.7 2.7.3 3.0.1 jruby-9.2.17.0 mruby-3.0.0 rbx-5.0 truffleruby-21.1.0 truffleruby+graalvm-21.1.0 今回は、2.6.7のバージョンのRubyをインストールする。 以下のコマンドを実行して、2.6.7のRubyをインストールする。 rbenv install 2.6.7 インストールが終わったら、以下のコマンドを実行する。 rbenv versions * system (set by /Users/()/.rbenv/version) 2.6.5 2.6.7 このコマンドでは、現在インストールされているRubyを一覧で確認できる。 2.6.7が表示されているので、ちゃんとインストールできた。 では、今回インストールしたバージョンのRubyを使用するように設定を変更する。 以下のコマンドを実行する。 rbenv global 2.6.7 これで2.6.7のRubyが使えるようになった! 以下のコマンドを実行してみる。 ruby -v ruby 2.6.7p197 (2021-04-05 revision 67941) [x86_64-darwin19] 正しく設定ができれば、2.6.7と表示されたはず。 ——————————————————— Ruby環境の構築確認 以下のコマンドを実行する。 rbenv versions system 2.6.5 * 2.6.7 (set by /Users/()/.rbenv/version) 今回インストールするバージョンは6.0.3(Railsチュートリアルに合わせる)。 Ruby on Railsのインストール Railsの導入は至って簡単。 以下のコマンドを実行する。 gem install rails -v “6.0.3” エラー発生。 ERROR: Error installing rails: ERROR: Failed to build gem native extension. current directory: /Users/()/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/gems/mimemagic-0.3.10/ext/mimemagic /Users/()/.rbenv/versions/2.6.7/bin/ruby -rrubygems /Users/()/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/gems/rake-12.3.3/exe/rake RUBYARCHDIR\=/Users/()/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mimemagic-0.3.10 RUBYLIBDIR\=/Users/()/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mimemagic-0.3.10 rake aborted! Could not find MIME type database in the following locations: ["/usr/local/share/mime/packages/freedesktop.org.xml", "/opt/homebrew/share/mime/packages/freedesktop.org.xml", "/opt/local/share/mime/packages/freedesktop.org.xml", "/usr/share/mime/packages/freedesktop.org.xml"] Ensure you have either installed the shared-mime-info package for your distribution, or obtain a version of freedesktop.org.xml and set FREEDESKTOP_MIME_TYPES_PATH to the location of that file. This gem might be installed as a dependency of some bigger package, such as rails, activestorage, axlsx or cucumber. While most of these packages use the functionality of this gem, some gems have included this gem by accident. Set USE_FREEDESKTOP_PLACEHOLDER=true if you are certain that you do not need this gem, and wish to skip the inclusion of freedesktop.org.xml. The FREEDESKTOP_PLACEHOLDER option is meant as a transitional feature, and will be deprecated in the next release. Tasks: TOP => default (See full trace by running task with --trace) rake failed, exit code 1 Gem files will remain installed in /Users/()/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/gems/mimemagic-0.3.10 for inspection. Results logged to /Users/()/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mimemagic-0.3.10/gem_make.out 似たような事例: https://hackmd.io/@mametter/mimemagic-info-ja shared-mime-infoがインストールされていない場合のエラーの例: Could not find MIME type database in the following locations:
["/usr/local/share/mime/packages/freedesktop.org.xml", “/opt/homebrew/share/mime/packages/freedesktop.org.xml”,
“/usr/share/mime/packages/freedesktop.org.xml”] ``` ~~~~~~~~~~ Rails 5.2.5 / 6.0.3.6 / 6.1.3.1はmimemagicに依存しなくなったので、これらにバージャンアップする。 gem install rails -v “6.0.3.6” rails -vを叩いても、インストールされないと出る。 ``` Rails is not currently installed on this system. To get the latest version, simply type: $ sudo gem install rails You can then rerun your "rails" command. ``` 似たような事例: https://qiita.com/amuyikam/items/313bc89c1de320a4257e gem install rails -v “6.0.3.6”でエラー発生。 ERROR: While executing gem ... (Errno::EACCES) Permission denied @ rb_sysopen - /Users/()/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/gems/rails-6.0.3.6/README.md (base) MacBook-Pro:~ ()$ which gem /Users/()/.rbenv/shims/gem ~~~~~~~~~~~ 似たような事例: https://qiita.com/nachiguro1003/items/4b564b92eca3ba35744a sudo chown -R (ユーザ名):staff /Users/(ユーザ名)/.rbenv で解決。 ~~~~~~~~~~~ 6.0.3.6がインストールされない。 一度アンインストールしてみる。 ~~~~~~~~~~~~ 似たような事例: https://qiita.com/owgll/items/e5c61b80a5fbce19a72f gem uninstall railties -v '6.1.3.1' ~~~~~~~~~~~~ 今回は、バージョン6.0.3のRailsをインストールする。 インストールが完了したら、Railsのバージョンを確認してみよう。 以下のコマンドを実行する。 rails -v Rails 6.0.3.6 Rails6.0.3.6と表示sれたので、Railsのインストールは完了。 Railsアプリの作成 Railsアプリを新規作成使用。 以下のコマンドを使用する。 rails new アプリケーション名 今回はsample_0426という名前で作成する。 rails new sample_0426 lsコマンドでアプリフォルダが作成されたことを確認しよう。 ls Applications Pictures Desktop Sites Documents VirtualBox VMs Downloads iCloud Drive(アーカイブ) HTML iCloud Drive(アーカイブ) - 1 Library iCloud Drive(アーカイブ) - 2 Movies mysite Music sample_0426 MyFirstGame 結婚式 New Unity Project ドキュメント OneDrive ローカルでRailsサーバを立てる Railsサーバを立てて、ローカルでアクセスしてみよう。 先程作成したsample_0426に以下のコマンドで移動する。 cd sample_app Railsのサーバを立てる時には以下のコマンドを実行する。 rails s エラー発生。 => Booting Puma => Rails 6.0.3.6 application starting in development => Run `rails server --help` for more startup options Exiting /Users/()/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/gems/webpacker-4.3.0/lib/webpacker/configuration.rb:95:in `rescue in load': Webpacker configuration file not found /Users/()/sample_0426/config/webpacker.yml. Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /Users/()/sample_0426/config/webpacker.yml (RuntimeError) ... from bin/rails:3:in `load' from bin/rails:3:in `<main>' とりあえず、インストールしてなかったYarnをインストールしてみる。 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 参考: https://classic.yarnpkg.com/en/docs/install/#mac-stable yarnをインストール。 npm install --global yarn ついでにnpmをupdate。 npm install -g npm yarnのバージョン確認。 yarn --version 1.22.10 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 上記後、エラー変わらず。 ~~~~~~~~~~~~~~~~~ 似たような事例; https://qiita.com/NaokiIshimura/items/8203f74f8dfd5f6b87a0 webpackerをインストールする。 rails webpacker:install *************** サーバーが立ったことが確認できたら、実際にアクセス使用。 ブラウザを開いてURLの場所に localhost:3000 と入力してみると、アクセスできる。 Railsサーバーを止めたい時は、 control + c で止められる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【TwitterAPI】エラー「Read-only application cannot POST.」→「いやさっき権限変えたよ?」

Twitter APIを使用してアプリと連携したツイート投稿機能を実装しているところ、上記エラーに遭遇。 API側の設定に権限変更する箇所があったので変更してみても変わらない…という方向けの記事です。 なお、権限変更はProject & Apps→ご自身のアプリ→Settings→App permissionsのところからできます。 結論…Access Tokenの再発行をしよう どうやら権限変更を反映させるためにはAcces Tokenの再発行が必要らしい。 再発行したところ無事権限の変更が反映された。 参考 Twitter APIの準備(rails)は以下の記事を参考にしました。 https://qiita.com/ayies128/items/80e1163caa2e1448ff9d https://qiita.com/ayies128/items/9fab1c68d747aaf96d2d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]RuboCopの使い方を解説

今回は以下の記事を参考にさせていただきました。 rubocopの使い方を紹介!インストール時のエラーを解決する方法も RuboCopの基本的な使用方法と出力の見方 はじめに Rubyの静的コード解析ツールであるRuboCopを使用したので内容をまとめておきます。 RuboCopを使用することで Rubyのコードを解析または自動修正してくれます。 インストール Gemfileに下記を入力してください Gemfile gem 'rubocop', require:false gem 'rubocop-rails', require:false gem 'rubocop-performance', require:false RuboCopはターミナル等で使用するため、require:falseをつけるようにします。 これで、bundlerによってRailsアプリ側に自動で読み込まれなくなります。 その後bundle installで完了です $ bundle install 使い方 下記を入力するとチェックがスタートして、結果を表示します $ rubocop 自動的に修正してほしい時は-aを使います。 $ rubocop -a 出力の見方 155 files inspected, 16 offenses detected 155ファイル中42個の指摘があると言う意味 違反レベル(5段階) Warning以上は直しましょう FFatal 危険度5 EError 危険度4 WWaring 危険度3 CConvention 危険度2 RRefactor 危険度1 また以下のコードでW以上に絞って検出することができます。 $ rubocop --fail-level W --display-only-fail-level-offenses 以上となります
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

マスアサインメント機能と脆弱性(Strong Parameters)

概要 なんとなくで終わらせないよう、しっかりStrong Parametersについて理解できるようしっかり手を動かす。 マスアサインメント機能とは RailsにおけるDBの更新系処理で複数のカラムを一括で指定できる機能の事。 例えば Person.new(name: 'nakamura', age: 29) といったように複数のカラムを一気に保存できる。便利な機能。 マスアサインメントの脆弱性とは マスアサインメントはハッシュ形式使用する。 例えばユーザーからのリクエストは params 変数に Hash として保存されています。 この内容をそのままにマスアサインメント機能を利用して設定していた場合に、 想定していないカラムを更新されてしまう可能性があります。 例えばUserクラスに name, age, admin の3カラムがあり、 adminはユーザーの画面からは更新させない管理者権限だとします。 Userの新規登録処理で、以下のようなコードを書いていた場合、 user = User.new(params[:user]) user.save 悪意あるユーザーがroleにadminという値を設定してリクエストを送ってきた場合(不正リクエスト)、意図せず管理者ユーザーを作られてしまう可能性がある。 それを防ぐためにストロングパラメータという機能がある。 Strong Parameters(ストロングパラメータ)とは マスアサイメント脆弱性を回避するためにrails4以降に提供されるようになった機能 def create @person = Person.new(person_params) end private def person_params params.require(:person).permit(:name, :age) end def <Model名>_params params.require(:<Model名>).permit(:<カラム名1>, :<カラム名2>) end 上記のように あらかじめ設定可能な値を明示的に宣言しておくことで脆弱性を回避できます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

草野球の出欠確認Webアプリを作ろう! part.2

これから作っていく簡単なWebアプリの作成メモ(自分の備忘)です。 自分用なのであまり凝りすぎないように書いていきたい。 <<前回の記事 今回やったこと わりと思い付きで管理者権限2種類をUserモデルに追加した。 $ bin/rails g migration add_admin_to_users admin:boolean 20210426163341_add_admin_to_users.rb class AddAdminToUsers < ActiveRecord::Migration[6.1] def change add_column :users, :admin, :boolean, default: false end end $ bin/rails g migration add_sub_admin_to_users admin:boolean 20210426163516_add_sub_admin_to_users.rb class AddSubAdminToUsers < ActiveRecord::Migration[6.1] def change add_column :users, :sub_admin, :boolean, default: false end end 今回作成している出欠確認アプリでは、スーパーアドミニストレータ(=私)がチームの代表1名にアドミニストレータ権限(admin = true)を与え登録するところをスタートと考えています。 その後チームの代表者がメンバーを登録していく際に、サブリーダーや副代表などのチームの首脳クラスのメンバーに「疑似的に」アドミニストレータ権限を付与するときに使用する目的で、2種類のフラグを用意した。 (私がアドミニストレータ権限を付与したユーザーが失踪したケースについては、運用保守が必須となってしまうため、この点はもう少し考慮の余地がある) スケジュールモデルの作成 出欠の管理をするアプリなので、スケジュールを扱うモデルの作成をする。 $ bin/rails g model Schedules title:string date_of:date start_time:time end_time:time meeting_time:time ※モデルのジェネレートの際、変数の型を指定するのに以下のWeb記事を参考にした。 Rails migrationで使うデータ型を考える マイグレーションの前に、生成されたマイグレーションファイルを編集する。 (これから使いそうな変数を考えつつ、長い1行のコマンドを作るのはしんどいので、とりあえず作ってからマイグレーションする前に整えることにした) 以下のWeb記事を参考にした。 NOT NULLなどの制約の設定 20210426172035_create_schedules.rb class CreateSchedules < ActiveRecord::Migration[6.1] def change create_table :schedules do |t| t.string :title, null: false, default: '' t.date :date_of t.time :start_time t.time :end_time t.time :meeting_time t.string :participant_id, null: false, default: '' t.string :absentee_id, null: false, default: '' t.string :holder_id, null: false, default: '' t.timestamps end end end 本当は日付や時間にも制約やデフォルト値を用意したかったが、日付単体や時間単体のデフォルト設定について知識不足なので、下手に設定するよりも後追いでマイグレーションを追加したほうがよくなるような気がして断念した。 $ bin/rails db:migrate マイグレーションを実行して、平日だし今回はここまで。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Railsでエラーに遭遇した時の虎の巻

何かあったときのための5コマンド docker-compose run web rake db:reset rm -rf node_module/.cache docker-compose run web rake db:migrate docker-compose run web yarn install --check-files docker-compose build どうしてもわからない時、このどれかを実行すると直ることがある。 docker-compose upで起動しない warning Integrity check: System parameters don't match error Integrity check failed error Found 1 errors. ======================================== Your Yarn packages are out of date! Please run `yarn install --check-files` to update. ======================================== 書かれているとおりにyarnをアップデートしても同じエラーが出る。 エラーのログに出ているとおり To disable this check, please change `check_yarn_integrity` to `false` in your webpacker config file (config/webpacker.yml). 同ディレクトリ内「config/webpacker.yml」ファイルのcheck_yarn_integrity箇所をfalseに変更するとエラーは出なくなる。 webpacker.yml check_yarn_integrity: false Sprockets:: DoubleLinkError scssだけにしてcssは削除すると、とりあえずこのエラーはなくなる。 ESOCKETTIMEDOUT yarn installなどのコマンドを実行した時、以下のようなエラーが出た。 info There appears to be trouble with your network connection. Retrying... info There appears to be trouble with your network connection. Retrying... info There appears to be trouble with your network connection. Retrying... info There appears to be trouble with your network connection. Retrying... error An unexpected error occurred: "https://registry.yarnpkg.com/material-design-icons/-/material-design-icons-3.0.1.tgz: ESOCKETTIMEDOUT". info If you think this is a bug, please open a bug report with the information provided in "【yarn-error.logのあるディレクトリへのパス】". これはダウンロードに時間がかかりすぎたことによって、ネットワークが正しくつながってないと誤認されインストールが途中で中断されている。 yarn installを行うディレクトリに.yarnrcという名前のファイルを作り、以下の内容を記述する。すでにある場合は末尾に追記、または該当する行の編集を行う。これによりタイムアウトの待ち時間が10分になるため多くの場合はダウンロードに成功し処理が進む。 network-timeout 600000 Could not freeze Could not freeze ./app/javascript/channels/index.js: Cannot read property 'hash' of undefined gitのブランチを切り替えるとソースコードは変わるがキャッシュは前のコードのままになるのでおかしくなったりする。 node_modules/.cache を消すと直る。 参考にした記事 【Rails, Docker】コンテナが起動後すぐに落ちてしまうトラブルの原因とその対処法 - logicoffee プログラミング勉強日記 yarnが原因でdocker-compose runが実行できないときの対処法 - Qiita 【Tips】yarn install時に発生しうるESOCKETTIMEDOUTの回避 - Qiita PHPerだった私がRuby on Railsで最初につまづいたこと | LINKBAL Blog
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS:Railsアプリをhttpsアクセス出来るようにしたらALBのヘルスチェックが通らなくなった時の対処

問題 Railsアプリをconfig.force_ssl = trueでブラウザからhttpsアクセス出来る様にしたらALBのヘルスチェックが「unhealthy」となってしまう。 原因 httpからhttpsにリダイレクトさせる設定をしているので、 ヘルスチェックを行ったときにHTTPステータスコードで301が返って来るため。 config/environments/production.rb config.force_ssl = true 構成 以下の図の通りです。 対策 ロードバランサーでhttpからhttpsへリダイレクトするようにする。 NGINXの設定で対処方法もありますが、これが一番簡単そうなので。 手順 1.config.force_ssl = trueをコメントアウトする。 config/environments/production.rb # config.force_ssl = true 2.ロードバランサーのコンソール画面のリスナータブを選択し、HTTP:80の"ルールの表示/編集"を開く。 HTTP:80のリスナーを削除している場合は新たに追加して下さい。 3.+タブを選択しルールの挿入を選択してルールを追加します。 4.すべての条件においてhttpからhttpsへリダイレクトさせたいので、パスの指定を*(アスタリスク)にします。 5.”アクションの追加”を選択してリダイレクト先を以下の通りに指定して保存ボタンを押してルールを追加します。 確認 httpでアクセスするとawselbによってhttps(443)にリダイレクトされるようになります。 $ curl -i http://www.xxxxxx.work HTTP/1.1 301 Moved Permanently Server: awselb/2.0 Date: Mon, 26 Apr 2021 16:05:10 GMT Content-Type: text/html Content-Length: 134 Connection: keep-alive Location: https://www.xxxxxx.work:446/ ALBのヘルスチェックもhealthyに変わっています。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

環境変数を簡単に管理することができるgem dotenv-rails まとめ

はじめに 環境変数を使うタイミングがあり、途中で便利なgemがあることを知り、使おうと思ったのがきっかけ。 まだ知識が浅いため細かくは解説できないけど、自分なりにまとめてみました?‍♂️ dotenv-rails  gem 環境変数を簡単に管理することができるgemのこと 環境変数は主に漏洩すると危険なアクセスキーなどを隠して使いたいときや、テスト環境、開発環境などの環境によって異なる値を使いたいときに使う。後者の使い道で使ったことはまだない、、、 私は今回はメールアドレスを隠すために使った。 使い方 1.gemインストール ここはgemをインストールする時と一緒、bundle installも忘れずにやって 2.環境を指定する場合 gemファイル. gem 'dotenv-rails', groups: [:development, :test] ---gemが複数ある場合は下記の記述で--- group :development, :test do # 上記と同等 gem 'dotenv-rails', groups: [:development, :test] end 3.「.env」ファイルの作成 .envファイルは環境変数を記述するためのファイル アプリケーションの直下に作成する。ターミナルにてアプリケーションのディレクトリでtouch .envと記述して作成する。 ターミナル. xxxxxMacBook-Pro アプリケーション名 % touch .env 4.定義する env. SECRET_KEY = YOURSECRETKEY のように定義する 呼び出すときは、ENV['環境変数名']で呼び出せる 5.gitで公開しないために ここもかなり大事なポイントで、環境変数として使えるようになっているが、このままgitに公開するとモロにみられてしまうので、gitignoreファイルに.envファイルを追記して、gitで公開しないようにする。 gitignore. /.env # 環境毎のファイルがある場合 /.env.production /.env.local,,, ここまでがセット 参考文献 他にも、環境ごとに環境変数の値を変える方法や、実際の使用例などが乗っている?‍♂️ url: https://pikawaka.com/rails/dotenv-rails#Git%E7%AE%A1%E7%90%86%E4%B8%8B%E3%81%8B%E3%82%89%E5%BF%85%E3%81%9A%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

環境変数簡単に管理することができるgem dotenv-rails まとめ

はじめに 環境変数を使うタイミングがあり、途中で便利なgemがあることを知り、使おうと思ったのがきっかけ。 まだ知識が浅いため細かくは解説できないけど、自分なりにまとめてみました?‍♂️ dotenv-rails  gem 環境変数を簡単に管理することができるgemのこと 環境変数は主に漏洩すると危険なアクセスキーなどを隠して使いたいときや、テスト環境、開発環境などの環境によって異なる値を使いたいときに使う。後者の使い道で使ったことはまだない、、、 私は今回はメールアドレスを隠すために使った。 使い方 1.gemインストール ここはgemをインストールする時と一緒、bundle installも忘れずにやって 2.環境を指定する場合 gemファイル. gem 'dotenv-rails', groups: [:development, :test] ---gemが複数ある場合は下記の記述で--- group :development, :test do # 上記と同等 gem 'dotenv-rails', groups: [:development, :test] end 3.「.env」ファイルの作成 .envファイルは環境変数を記述するためのファイル アプリケーションの直下に作成する。ターミナルにてアプリケーションのディレクトリでtouch .envと記述して作成する。 ターミナル. xxxxxMacBook-Pro アプリケーション名 % touch .env 4.定義する env. SECRET_KEY = YOURSECRETKEY のように定義する 呼び出すときは、ENV['環境変数名']で呼び出せる 5.gitで公開しないために ここもかなり大事なポイントで、環境変数として使えるようになっているが、このままgitに公開するとモロにみられてしまうので、gitignoreファイルに.envファイルを追記して、gitで公開しないようにする。 gitignore. /.env # 環境毎のファイルがある場合 /.env.production /.env.local,,, ここまでがセット 参考文献 他にも、環境ごとに環境変数の値を変える方法や、実際の使用例などが乗っている?‍♂️ url: https://pikawaka.com/rails/dotenv-rails#Git%E7%AE%A1%E7%90%86%E4%B8%8B%E3%81%8B%E3%82%89%E5%BF%85%E3%81%9A%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む