- 1. 【第9章】Railsチュートリアル 5.1(第4版) 発展的なログイン機能
- 2. rspecの始め方
- 3. Rails.application.credentials.xxxxx[:yyyy]が空になる時の対策
- 4. [Rails]serializeなcolumnのdefault値を空の配列にしたい。
- 5. ログイン機能の実装(ウィザード形式にするために)
- 6. 【Rails】簡単にDatetimepickerを使う方法
- 7. 【YAML】Railsのdatabase.ymlについてなんとなく分かった気になっていた記法・意味まとめ
- 8. each_with_objectの簡単なサンプルメモ
- 9. 【RSpec】同じパターンのテストシナリオをJSONで定義して外出しする
- 10. macOSをCatalinaにしたらRubyとRailsが消えた時【zsh: /usr/local/bin/rails: bad interpreter: System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: no such file or directory】の対処
- 11. Homebrew + rbenv + Bundler + dockerで開発環境をマネージドに構築する(番外編-Ruby on Railsアプリ)
- 12. 変数で見るRubyとPythonの違い
- 13. gRPCメモ
- 14. graphql-rubyでresolverを使ってqueryをシンプルに保つ
- 15. master以外のブランチからherokuにpushする方法
- 16. Redis の WebAPI (Ruby CGI)
- 17. #Ruby Error class message / raise second args or Error class initialized message
- 18. rails g migrate で外部キーを追加する
- 19. rubyでファイル末尾の改行を消す
- 20. [Ruby]ネストされたHash(連想配列)をフラット(1階層)にする②
【第9章】Railsチュートリアル 5.1(第4版) 発展的なログイン機能
#はじめに
筆者は非IT業界から独学でRails学習中で、備忘録目的で執筆しています。
個人的に本章はこれまでの章より難易度が高かったです?(2周目確認・整理が必須と感じました、不足等あれば訂正致しますのでおっしゃっていただければ幸いです)
筆者は[安川さん](https://twitter.com/yasulab)講義の動画版を模写するような形で学んだため、演習でなく全体を流す程度に参考にしてもらえたら嬉しいです。<参考>
[Ruby on Rails チュートリアル 第9章 永続的セッション(cookies remember me 記憶トークン ハッシュ)を解説](https://qiita.com/bitcoinjpnnet/items/639cbace7cb806379452)
個人的に非常に理解しやすい記事でした。
(Cookieの攻撃手法などは改めて追記したいほどです)#9.1 Remember me 機能
##Remember me とは
主にアカウント認証に用いられる機能の一つで、ユーザーがログイン時に入力したアカウント情報をサーバ側で持つ(UI視点での)機能
rspecの始め方
Gemfileに
“`
gem ‘rspec’
group :development, :test do
gem ‘rspec-rails’
end
“`コマンドラインで
“`
$ bundle install
$ bundle g rspec:install
“`
Rails.application.credentials.xxxxx[:yyyy]が空になる時の対策
# Rails.application.credentials.xxxxx[:yyyy]
Credentialsもしっかり設定しているし、rails cコマンドではちゃんと読み込める
しかも共同開発してる他のメンバーでは読み込める
でも私のhttp://localhost:3000/ 環境では中身がないとエラーが出る# 原因
はっきりわかってないけれど、恐らく権限の問題# 対策
すでにあるmaster.keyを消して、同じ文字列で作り直す
[Rails]serializeなcolumnのdefault値を空の配列にしたい。
# やりたいこと
“`ruby:migration
class Users < ActiveRecord::Migration[5.1] def change create_table :users do |t| t.integer :id t.string :hoges, null: false, default: [] # これ end end end ``` でもこれじゃ ``` == 20200109052420 Users: migrating ============================ -- create_table(:search_histories) rails aborted! StandardError: An error has occurred, all later migrations canceled: can't quote Array /Users/lyrical_school/project/disappearing_planet/db/migrate/20200109
ログイン機能の実装(ウィザード形式にするために)
#1.deviseの導入及びユーザーのデフォルトでのログインが可能になるまで
以下の手順で導入“`GEMFILE.
gem ‘devise’
“`“`ターミナル.
rails g devise:install
“`
任意のコントローラー(***)を用意して、ルーティングの設定をします。
この場合は、トップページに当たる部分のルーティングの設定をしています。“`config/routes.rb
Rails.application.routes.draw do
root to: “***#index”
end
“`
“`ターミナル.
rails g controller ***
“`
今回はindexアクションにおいて、特にモデルとのやり取りなどは行わないので、コントローラ内の記述はしません。(任意でトップページのビューは作成したものを使用)次いでdeviseにおけるデフォルトのログイン機能を実装します。
“`ターミナル.
rails g devise user
“`今回は、deviseのデフォルトで用意されているemailとpasswordを
【Rails】簡単にDatetimepickerを使う方法
# はじめに
個人的にオススメなDatetimepickerについて、紹介しようと思います。
導入がめちゃくちゃ簡単です。# できあがり例
こんな感じで、日付と時間を選ぶと実装することができます。個人的にこのdatetimepickerが優れていると感じる点は以下です。
* __はじめからカレンダーと時間が表示されていること__
* __ボタンをクリックする回数が2回で入力ができること__他のdatetimepickerだと、日付をクリックしないと時間の欄が表示されないため作業量を一瞬で把握できません。
微妙な差ではありますが、ユーザーが少しでも楽な方を考えました。# 使い方
まず、“`GemFile“`に以下の“`gem“`を記載して、“`bundle inst
【YAML】Railsのdatabase.ymlについてなんとなく分かった気になっていた記法・意味まとめ
## はじめに
「そういえば、**yaml**って良く使うくせにちゃんと調べたことがないな」
と思い、特徴的な書き方をする機能3つに絞ってまとめました。[YAMLの公式はこちら](https://yaml.org/)
**Ruby on Rails**で良く使う、`database.yaml`を例に説明します。
## 環境
“`yaml
OS: macOS Catalina 10.15.1
Ruby: 2.6.5
Rails: 6.0.2.1
“`## そもそも`yaml`って何?
> YAML is a human friendly data serialization
standard for all programming languages.公式より抜粋しました。
「YAMLは全てのプログラミング言語で使える、人間に優しいデータの書き方だよ!」ということですね。
要するに、**複雑なデータ構造をシンプルに表現するファイル形式**です。
ここから**Ruby on Rails**の`app/config/database.yml`を例に、**他ではあ
each_with_objectの簡単なサンプルメモ
# メモ
> enum.each_with_object(object) {|item, memo| block }
each_with_indexメソッドは、要素を使って何らかのオブジェクトを操作するのに使います。要素の数だけブロックを繰り返し実行し、繰り返しごとにブロック引数itemには各要素を、memoには引数objectで指定したオブジェクトを入れます。戻り値は、objectのオブジェクトです。
https://ref.xaio.jp/ruby/classes/enumerable/each_with_object# サンプル
“`ruby
require “pp”arr = [1, 2, 3]
result = arr.each_with_object([]) do |item, memo|
p item # => 1…
memo << 1 end pp result # => [1, 1, 1]result = arr.each_with_object([1, 2, 3]) do |item, memo|
memo << 1 end pp
【RSpec】同じパターンのテストシナリオをJSONで定義して外出しする
# 解決できるケース
以下のようなケースに適用できると思います。
あくまで飛び道具的な手法なので、常用は良いと思いません。* 同じ機能を複数のパラメータパターンで実行して結果を評価する場合、実装を軽量化できる。
* JSONファイルにパラメータ部分のみを外出しするため、RSpecを書けない人でもテストケースのメンテナンスが可能# 経緯
ある案件で給与計算モジュールを実装した際に、深夜・残業・休日の手当や、勤務時間に関するモジュールなどを実装し、それぞれテストケースを作りました。
ただ、それだと心もとないため、給与計算モジュール群の統合テストケースを実装することとなりました。例えば、
「時給¥1000で10:00~15:00勤務」「時給¥1001円で18:00~24:00勤務」・・・など
一定のパラメータに複数パターンを入力して結果を評価するテストケースが必要になりました。
そこで、ケースはJSONファイルに書き出しておき、テストの実装はループでやってみようということで、以下のようなRSpecを作成しました。# 実装
contextをtest_caseの数分ループす
macOSをCatalinaにしたらRubyとRailsが消えた時【zsh: /usr/local/bin/rails: bad interpreter: System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: no such file or directory】の対処
##Catalinaにした後Rubymineのプラグインを挿入後の再起動でRailsが消えた
エディターでRubymineを使用しているのですが、プラグインを挿入し再起動、%rails sなどのコマンドをしても、『Rails is not currently installed on this system. To get the latest version, simply type: $ sudo gem install rails』とエラーが発生。###rbenvのパスの設定が変わったと想定
ここら辺の環境設定ではプログラミング初心者はとても頭を悩ます分野。
プログラミングスクールのDive Into Codeに通っていた頃、メンターの皆様によく教わりました。
「bash~が〜」とか「システムでのRubyとローカルは違う〜」「rbenvのpathは〜」
色々教わりましたが、Rubyの構文やRailsの仕組み、そもそもブラウザの仕組みやHTMLやCSSを働きながら多方面の分野を勉強する為、環境構築はとても苦手でした。###極論:教授して頂いたコードをコピペ
ここでは一応腹落
Homebrew + rbenv + Bundler + dockerで開発環境をマネージドに構築する(番外編-Ruby on Railsアプリ)
#### 〜[後編](f3bc148e59fbad21eab9)〜からの続き
## 前提
– 便宜上、既存のワーキングコピーがあります
– ただし、 `Dockerfile` や `docker-compose.yml` は後編からガラッと変わります## Docker手順
### Dockerfileのコマンド
| コマンド | 説明 |
|:——–|:—-|
| FROM | 使用するイメージとバージョン |
| RUN | コマンドの実行。railsに必要な必要なnodejsとpostgeqsqlをインストールしている |
| WORKDIR | そのままの意味。作業ディレクトリを設定します。 |
| ADD | ローカルのファイルをコンテナへコピーする(昔のCOPYコマンドになります) |
| ENTRYPOINT | 一番最初に実行するコマンド(ここではentrypoint.shを参照) |
| EXPOSE | コンテナがリッスンするport番号 |
| CMD | イメージ内部のソフトウェア実行(つまりRailsのことですね) |##### 1
変数で見るRubyとPythonの違い
# ローカル変数のスコープ
rubyではローカル変数の参照は定義されたスコープ内のみです。
“`ruby:ruby
a = 1def func
puts a
endfunc #=> error (undefined local variable)
“`pythonでは子孫スコープからも参照できます。
“`python:python
a = 1def func():
print(a)func() #=> 1
“`さらに、ローカル変数は定義されているスコープが消滅しても、子孫スコープなどから参照されている限り消去されません。この性質を応用してインスタンス変数を持つクラスのようなものを作ることもできます。このクラスもどきのインスタンスメソッドもどきをクロージャーと言います。
“`python:python
def cls(): # クラスもどき
x = {} # インスタンス変数もどきdef a(): # クロージャー
x[‘a’] = 1def b(): # クロージャー
x[‘b’] = 1de
gRPCメモ
自身のメモとしてgRPCをまとめてみました。
# gRPCとは
protocol buffersをMessage interchange format(メッセージのI/Oに使うための形式)として使えるリモートプロシージャコールシステムです。### protocol buffersとは
IDL:Interface Definition Language (インタフェース定義言語)を用いたファイルフォーマットです。### gRPCで何ができるのか
クライアントが別のマシンにあるメソッドをまるでローカルにあるかのように使えるようになります。
下の図のように様々なプログラミング言語に対して実装できる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270964/7b45a2d4-117f-b81c-5b49-3a85cf1f50fa.png)
#### 雑に言うと
今までjsonなどを介してAPIを叩いていたようなところを、もっと確固たる定義をもった上でより高パフォーマンスでやりと
graphql-rubyでresolverを使ってqueryをシンプルに保つ
# 概要
graphql-rubyを使っていると、query_type.rbが肥大化してしまう傾向にあります。
GitHubのIssueを見ていたところ、query_type.rbにおいてResolverを使うことで肥大化を(なるべく)回避するベストプラクティスが紹介されていて、公式ガイドにも反映されていなかったようなので共有したいと思います。
参考Issue:
https://github.com/rmosolgo/graphql-ruby/issues/1825#issuecomment-441306410ちなみに確認したバージョンは以下の通りです。
|ライブラリ|バージョン|
|:–|:–|
|ruby|2.6.5|
|graphql-ruby|1.19.5|また、GraphQLのレスポンスとしては、ユーザー単体とリストを返却することを想定するものとします。
ユーザーのモデルは以下のイメージです。
“`ruby:db/schema.rb
create_table “users”, force: :cascade do |t|
t.string “em
master以外のブランチからherokuにpushする方法
#railsアプリを作って、herokuをデプロイする(masterブランチ以外からデプロイする方法も同時に載せています。)
##1 コミット
“`
$ git add .
$ git commit -m “heroku”
$ git push origin ブランチ名
“`##2 herokuにアプリケーションを新規作成する
“`
$ heroku create
“`##3-1 herokuにデプロイする(masterブランチにいる時)
“`
$ git push heroku master
“`##3-2 herokuにデプロイする(master以外のブランチにいる時)
“`
$ git push heroku <現在いるブランチ名>:master
“`###※3-1 or 3-2 どちらかを実行してください
##4 herokuにデータベースを作成する
“`
$ heroku run rails db:migrate
“`##5 アプリケーションを開く
“`
$ heroku open
“`以上で、完成です。
Redis の WebAPI (Ruby CGI)
こちらで定めた仕様を満たすサーバーサイドのプログラムです。
Nginx + fcgiwrap で動作を確認しました。
[Redis の WebAPI を作成](https://qiita.com/ekzemplaro/items/1746b31beef382023f2d)“`rb:redis_read.rb
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
# ———————————————————————
# redis_read.ruby
#
# Jan/16/2020
#
# ———————————————————————
require ‘redis’
require “cgi”
require “json”
#
STDERR.puts “*** 開始 ***”
#
$cgi=CGI.new
key = $cgi[“key”]
# key = “t18
#Ruby Error class message / raise second args or Error class initialized message
“`rb
raise StandardError.new(‘ERROR in class’)
# StandardError: ERROR in classraise StandardError, ‘ERROR in raise arg’
# StandardError: ERROR in raise argraise StandardError.new(‘ERROR in class’), ‘ERROR in raise arg’
# StandardError: ERROR in raise arg“`
# Original by Github issue
https://github.com/YumaInaura/YumaInaura/issues/2948
rails g migrate で外部キーを追加する
ポートフォリオ作成中に後から外部キーを追加しよとしたら、コマンドに詰まったので忘れないために記事にしておく。
articleテーブルにuser_idを追加する
“`
rails g migration AddUserRefToArticles user:references
“`成功したら
“`
rake db:migrate
“`
を実行する。
rubyでファイル末尾の改行を消す
git diffしたときの
「\ No newline at end of file」がウザいのでrubyで置換した・パターン1
“`ruby
ruby -i -ne ‘print ARGF.eof? ? $_.chomp : $_’ test.txt
“`・パターン2
“`ruby
ruby -i -e ‘print ARGF.read.strip’ test.txt
“`sedでやりたかったな
もっといい方法あれば教えて下さい
viで↓をやるのがめんどくさかった
https://qiita.com/lemtosh469/items/b3a5b3b40d9f44dfbd06(本当は末尾に改行がある方が正しいらしい)
[Ruby]ネストされたHash(連想配列)をフラット(1階層)にする②
最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです!#Hash(連想配列)を取り除く
前回からの続きです!
・[[Ruby]ネストされたHash(連想配列)をフラット(1階層)にする①
](https://qiita.com/hirokik-0076/items/771325ab561851af0dbb/)ここからやっていきたいのは配列に入っている要素がHashだったら変数に変換する処理します。
要は、配列に入っている要素をチェックしてHashだったら特定の処理をしたら良いのです。“`ruby
#配列の場合
family_array = [ “sazae”, “masuo”, “tarao” ]
pry(main)> family_array.is_a?(Hash)
=> false#連想配列の場合
family_hash = { “tsuma” => “sazae”, “otto” => “masuo”, “ko