20210427のRubyに関する記事は17件です。

【Ruby】メソッド【備忘録】

はじめに ※自分用のメソッドメモです getsメソッド ユーザーがキーボードで入力した値を文字列として取得してくれるメソッド。 返り値は入力した値の文字列になる。 基本構文1 irb(main):001:0> name = gets yamada => "yamada\n" irb(main):002:0> name => "yamada\n" 2行目に入れた値が3行目に表示されている。 gets.chompとすることにより改行なしの状態で文字列が表示される。 数字の場合はgets.to_iにする。 .splitメソッド 文字列を指定区切り文字で分割し、配列を繰り返すメソッド。 ・第一引数→区切り文字 ・第二引数→分割数 基本構文1 irb(main):001:0> "a:b:c".split(':') => ["a", "b", "c"] ・区切り文字→:(コロン) ・分割数:なし 「a : b : cを':'(コロン)で分割しました」 基本構文2 irb(main):001:0> "a:b:c".split(':', 2) => ["a", "b:c"] ・区切り文字→:(コロン) ・分割数:2 「a : b : cを':'(コロン)で2分割しました」 この時、コロンは左から探すため、aとbのコロンで分割される。 配列に.splitメソッドを使用する irb(main):001:0> ["a:b:c:"].split(':') Traceback (most recent call last): 4: from /Users/haruka/.rbenv/versions/2.6.7/bin/irb:23:in `<main>' 3: from /Users/haruka/.rbenv/versions/2.6.7/bin/irb:23:in `load' 2: from /Users/haruka/.rbenv/versions/2.6.7/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>' 1: from (irb):1 NoMethodError (undefined method `split' for ["a:b:c:"]:Array) splitメソッドはStringクラスのメソッドのためstring意外に使用するとエラーになる。 カンマとコロンの両方に一致する部分で分割したい場合 irb(main):001:0> "10:30,14:55".split(/[:|,]/) => ["10", "30", "14", "55"] 1バイトの空白文字で区切る場合 irb(main):001:0> "abc de f".split(' ') => ["abc", "de", "f"] split(' ')で対象となる文字列中の空白文字は、半角スペース、改行、タブの3つある 区切り文字に一致する部分すべてを分割する必要がない場合 irb(main):001:0> "abc de f".split(' ').first => "abc" firstメソッドを使うと、区切り文字の分割された最初だけ取得できる .mapメソッド 配列の要素の数だけブロック内で処理を繰り返して、新しい配列を返すメソッド。 配列、ハッシュどちらでも使える。 基本構文 配列.map { |変数| 実行する処理 } 実行する処理が複数ある時 配列.map do |変数| 実行する処理 end 数字の足し算 irb(main):001:0> number = [1, 20 , 300] => [1, 20, 300] irb(main):002:0> new_number = number.map { |n| n * 2 } => [2, 40, 600] irb(main):003:0> new_number => [2, 40, 600] ハッシュで使う場合 irb(main):001:0> N = {a: 1, b: 20, c: 300} => {:a=>1, :b=>20, :c=>300} irb(main):002:0> N.map {|key, number| number * 2} => [2, 40, 600] #返り値は配列になる splitメソッドとmapメソッドを組み合わせる 基本構文 "文字列".split(区切り文字, 分割数).map { |変数| 実行する処理 } 分割した配列の要素を文字列から数値に変換 #数字の文字列をsplitメソッドで分割した場合 irb(main):001:0> num = "1, 20, 300".split(',') => ["1", " 20", " 300"] irb(main):002:0> num[0] => "1" irb(main):003:0> num[0].class => String #mapメソッドと組み合わせて各要素を数値にした配列を取得する irb(main):004:0> num = "1, 20, 300".split(',').map {|n| n.to_i} => [1, 20, 300] irb(main):005:0> num[0] => 1 irb(main):006:0> num[0].class => Integer .timesメソッド 指定した整数の回数だけdo~endに記載している処理を繰り返し処理してくれるメソッド。 Inbtegerクラスのメソッドのため整数で指定してあげる。 基本構文1 整数オブジェクト.times do # 繰り返す処理 end 繰り返し表示させる 3.times do puts "こんにちは" end #入力結果 こんにちは こんにちは こんにちは 「3回"こんにちは"を表示させる」 getsと組み合わせる 3.times do #3回下記の処理を繰り返します  name = gets.chomp  puts "#{name}さん、こんにちは" end やまだ #1回目 やまださん、こんにちは  たかはし #2回目 たかはしさん、こんにちは すずき #3回目 すずきさん、こんにちは 繰り返す回数を入力して決める時 count = gets.to_i #回数を変数countに代入する => 3 #今回は3回繰り返してもらう count.times do #countに代入した回数だけ処理を繰り返します(今回は3回)  puts "こんにちは" end #入力結果 こんにちは こんにちは こんにちは timeメソッドとifを組み合わせる 3.times do number = gets.to_i if number % 2 == 0 puts "#{number}は偶数です"  else puts "#{number}は奇数です" end end #入力結果 14 14は偶数です 12 12は偶数です 15 15は奇数です
  • このエントリーをはてなブックマークに追加
  • 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で続きを読む

sketchupでruby その17

概要 sketchupでrubyやってみた。 練習問題やってみた。 練習問題 周りを囲め。 写真 サンプルコード def ga entities = Sketchup.active_model.entities pi = Math::PI (-24..24).each { |i| group = entities.add_group face = group.entities.add_face [0, 0, 60], [0, 20, 60], [1, 20, 60], [1, 0, 60] face.pushpull -1 phi = i * pi / 24 trn = Geom::Transformation.translation [0, 0, 100] rot = Geom::Transformation.rotation [0, 0, 0], [0, 1, 0], phi group.transform! trn group.transform! rot } end 以上。
  • このエントリーをはてなブックマークに追加
  • 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で続きを読む

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]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で続きを読む

本番環境のエラーログを確認する(cloud9)

忘備録!!!! linuxにログインしてログを確認。 nginxのエラーログを確認する linux $ sudo tail -f /var/log/nginx/error.log Railsのエラーログを確認する。 linux $ sudo tail -f log/production.log エラーログのみ出力 linux $ tail -f ファイルパス | grep ERROR Heroku cloud9のコンソール $ heroku login -i $ heroku logs
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rspec入門

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

マスアサインメント機能と脆弱性(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で続きを読む

環境変数を簡単に管理することができる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で続きを読む