- 投稿日:2019-10-01T23:16:23+09:00
【Rails】Slim基本文法【初心者】
はじめに
Railsを使った開発で使うことになるであろうSlimについて簡潔にまとめてみました。
Slimとは
Railsで使用できるRuby製のHTMLテンプレートエンジン。
Slimのメリット
HTMLをよりシンプルに見やすく書くことができる。
Slim導入
Slimジェネレータを提供してくれる
slim-rails
とERB形式のファイルをSlim形式に変換してくれるhtml2slim
という2つのGemをインストールgem 'slim-rails' gem 'html2slim'Slimへ変換
すでにあるerb形式のファイルをSlim形式に変換するときは以下のコマンド
$ bundle exec erb2slim 変換したいerbファイルのパス --deleteSlim基本文法
<>
が不要、や<% end %>等の閉じタグも不要
<%= %>
→=
<% %>
→-
id指定 →#
class指定 →.
コメント →/
改行 →|
ERBとSlimの比較
最初にERB形式
example.html<div class="contents nav"> <ul class="navbar-nvv"> <% if current_user %> <li><%= link_to("MyPage", user_path, class: "nav-link") %></li> <% else %> <li><%= link_to("LogIn", login_path, class: "nav-link") %></li> <% end %> </ul> # これはコメントです <p id="greeting">Hello World!!</p> </div>次がSlim形式
example.html.slim.contents.nav ul.navbar-nav - if current_user li= link_to "MyPage", user_path, class: "nav-link" - else li= link_to "LogIn", login_path, class: "nav-link" / これはコメントです p#greeting Hello World!!さいごに
かなりスッキリしましたね!
以上Slimの基本文法でした。
- 投稿日:2019-10-01T22:58:51+09:00
WSL上でRuby on Rails + MySQLの環境づくり
はじめに と 注意
Ruby on Rails + MySQLの環境構築をしていく記事です。
先人様の記事の内容を主に進めていって、エラーが出たとこの解決策を書いてます。
初記事なのでやさしい目で見てください。背景
Rails + MySQL でアプリ作ってみたいけど環境構築で意味わかんないエラー出ちゃった。
全部Windowsのせいにしよう(逃避)。
でもmac持ってない......WSLならできるかな...?(ちなみに過去にWSL上で開発環境整えようとして失敗した。)
対象
- WSL上でRuby on Railsの開発をしたい!
- SQLiteじゃなくてMySQLでやりたいけど環境構築わかんね!
という方向け。
環境
- Windows 10 Home 64bit
- WSL( Windows Subsystem for Linux ) Ubuntu 18.04.3 LTS
1. WSLにRuby on Rails環境を整える
さっそく他人様まかせで申し訳ないですが
とても、とても素晴らしい記事があるので
ほぼこれを参考にやっていきます...
- Windows10 で WSL を使って Rails 環境を構築したときのメモ
- WSL導入もあります、シンボリックリンクまでやってください!
- Rubyのバージョンは2.6.3にしました。
※一部別の方法でインストールする部分があるのでリンク先とこの記事を見比べながら作業してください。
(一個一個のインストールに割と時間かかるので気長に待ちましょう。特にrubyのインストール)少し変更を加える部分 (と軽いhelp)
「2. Node.jsを入れよう」部分
nodejsを導入する際の
sudo apt-get install npmというコマンドだとnodeおよびnpmのバージョンが最新ではないためやり方を変更。
間違えて入れちゃったというひとも指示に従ってすれば大丈夫(たぶん)さあ説明を読むぞって思ったひとにはごめんなさい。この記事が神。
- 続・WSL(Ubuntu)でnode.jsの開発をする準備さっきのコマンドで入れちゃったって人は「削除する」って項目からやってください。
もう1つ
WSLを再起動とかすると
node -v
をしたときにnot found エラーが起きるかも。
そういうときはexport PATH=$HOME/.nodebrew/current/bin:$PATHを vim かなんかで
~/.bashrc
に追記して試してみてください。
vim で追記する方法は下の方。「3. rbenvを入れよう」部分
たいしたことではないですが最後の方で
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"を ~/.bashrc に追記する(厳密には上の1行はすでに追記されているはず)手順があります。
「どうやって!?」と思った方は下の方に書いてある「.bashrcに追記ってどうするの!!」を見て追記してみてください。「5. Rubyを入れよう」部分
本当に時間かかります。環境にもよると思うけれど僕は2~30分かかりました(笑)
解決策?
- 普通は長くて10分くらいらしいのでいったん待ってみる。
- "rbenv install ruby 遅い"でググって出てきたのを試す
BUILED ERROR!! となる人へ
僕も一度なりました。エラー文中に
Try ~~~ `apt -------`といった感じであったので(詳細なエラー文コピー取るの忘れてました;;)、
それに従ってコマンド実行すると治りました。.bashrcに追記ってどうするの!!
下のコマンドで、vim で .bashrc を開いて一番下とかに追記していく。
vim ~/.bashrcvim の使い方はこちらでどうぞ
- 知識0から始めるVim講座2. Ruby on Rails + MySQL
Ruby on Railsの環境構築お疲れさまでした。
僕自身この記事を書きながらやっていたら3時間程度たっていました...笑
ということで次はMySQLです。MySQLのインストール
まずはMySQLをインストールしていきます。が、ここでもとても良い記事を見つけました。
- WSLのUbuntu 18.04でMySQL 5.7をセットアップこれ通りに行えばエラーなく行けるはずですが、
過去にMySQLいれたことある人や間違えちゃった人はエラーが起こるかも。(体験談)
僕の場合はWSL上からきれいにMySQLを消してもう一回やればいけました。
過去のMySQL関連のファイルとか消したくないって人以外は下記コマンドを実行しましょう。sudo apt-get remove --purge mysql-* sudo apt-get autoremove --purge sudo rm -r /etc/mysql sudo rm -r /var/lib/mysqlMySQLが起動中だとうまく全ファイルを消せないので、
sudo service mysql stopとしてサーバを停止してから行ってください。
またサーバが止まらない!止められない!という方は
MySQLのプロセスを確認してps ax | grep mysqlでてきたプロセスを片っ端から
kill
していけばサーバが停止します。sudo kill プロセス番号Railsと組み合わせる
MySQLのインストールが終わったのでRailsアプリケーションのデータベースをMySQLとして作っていきます。
まずはRailsで使うMySQLのアカウントを作ります!
rootでログインして、mysql -u root -p現在あるアカウントをチェック
select User,Host from mysql.user; +------------------+-----------+ | User | Host | +------------------+-----------+ | debian-sys-maint | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+-----------+Rails用のアカウントを作ってチェック
create user 'ユーザネーム'@'localhost' identified by 'パスワード'; select User,Host from mysql.user; +------------------+-----------+ | User | Host | +------------------+-----------+ | debian-sys-maint | localhost | | mysql.session | localhost | | mysql.sys | localhost | | railsuser | localhost | | root | localhost | +------------------+-----------+ちゃんと追加されました!
次はRails上でMySQLを使うためのgemをインストールしていきます。
gem install mysql2しかしここでエラー
ERROR: Error installing mysql2: ERROR: Failed to build gem native extension. -省略- mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again. -省略-指示に従って、一応
sudo
をつけて...sudo apt-get install libmysqlclient-devもう一回..!
$ gem install mysql2 Building native extensions. This could take a while... ... Done installing documentation for mysql2 after 0 seconds 1 gem installed通りました。
次にデータベースをMySQLに指定したRailsアプリケーションを作成。名前は適当。
rails new mysql-app -d mysql次にデータベース設定ファイルの書き換えをします。
Ruby on Railsの環境を構築したときにシンボリックリンクを設定したフォルダがあると思うのでそこに先ほど作ったRailsアプリケーションを移動。
最初からそこでrails new
すればよかったのでは?mv アプリの名前 移動先 -rvscodeを起動
ファイル > フォルダを開く > Railsアプリ(僕の場合mysql-app)
を選択してvscodeで開く。
config > database.yml
を開いて自分の登録したユーザネームとパスワードを入力します。default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: [ユーザネーム] password: [パスワード] socket: /var/run/mysqld/mysqld.sock development: <<: *default database: mysql_app_development test: <<: *default database: mysql_app_test production: <<: *default database: mysql_app_production username: mysql_app password: <%= ENV['MYSQL_APP_DATABASE_PASSWORD'] %>セーブ後データベースを作って
rails db:createアプリケーションを起動して
rails sブラウザ(http://localhost:3000) で確認出来たら終了です!
お疲れさまでした。参考
- Ruby on RailsでMySQLを使用・接続する際の手順と注意点
- RailsのDBを(初めから| |後から)MySQLに変更する
- 投稿日:2019-10-01T22:56:29+09:00
【Rails】form_withをSlimで書いてCheckBoxを横並びにした
はじめに
Railsでテンプレートにslimを使ったform_withの実装で若干苦戦したので、まとめてみました!
今回はCSSのフレームワークにSpectreを使っています。
(Bootstrapでも同様にできると思います。)Slimになかなか慣れない…
環境
- Ruby 2.6.3
- Rails 5.2.3
通常のform_withの書き方
hoge.html.slimsection.hoge-list h4 メール配信を希望の方はチェック = form_with(model: [:ops, @user], local: true) do |f| .form-group = f.check_box :hoge_column, class: 'form-control' = f.label :hoge_column, '配信する', class: 'form-label' .form-group = f.submitブラウザでは以下のようになる
これではUIが良くないためスタイルを整える必要があるインデント、Spectreを使いスタイルを整える
hoge.html.slimsection.hoge-list h4 メール配信を希望の方はチェック = form_with(model: [:ops, @user], local: true) do |f| .form-group = f.label :hoge_column, class: 'form-label form-switch' = f.check_box :hoge_column, class: 'form-control' | i.form-icon strong 配信する br .form-group = f.submit
- 投稿日:2019-10-01T22:47:42+09:00
【Rails】画像の表示方法
画像の表示方法でウンウン詰まったのでメモに残しておきます。
方法
2種類あり、それぞれ特徴やパスの書き方が違うみたいです。
1、assets配下に置く場合
格納先:
/app/assets/images/
今回はこちらを使用することにしました。
/app/assets/
内のファイルはアセットパイプラインの対象となる→結果ページ読み込み速度が早くなる。
※アセットパイプライン
ファイルを最小化(圧縮)して読み込みを早くしてくれるフレームワーク。(初期装備のよう)
アセットを連結することによって、ページリクエスト数を減らすことができる=更にページ速度向上につながるという仕組み。
画像であればブラウザのキャッシュを残すようにしてくれるため、画像の読み込みが早くなる。
ただし、キャッシュを飛ばさないと画像が正しく表示されない、など起きる。
リファレンスの内容が思ったよりあったので、これは今後詳しく学ぶことにします。書き方
htmlで書く場合<img src="/assets/img_logo_pc.png" alt="">「imagesいらないのかーい!」という不意打ちでした。
ヘルパーの場合<%= image_tag 'img_logo.png' %>ディレクトリ分けしたくなる気持ちがありましたが、そちらはいったん寝かしておきます。
2、public配下に置く場合
格納先:
/public/
ユーザーがアップロードする、などの場合はこちらがいいようです。
こちらは後ほど使用する際にまた追記します。判断基準
assets=「システム側に依存する画像関係」の場合に使用
public=「ユーザーがアップロードするような画像関係」の場合に使用とあった。
ざっと調べただけでは明確にわからなかったので、
現状まずは進めつつ今後深く考えていくことにします。参考サイト
アセットパイプライン - Rails ガイド
Railsの画像のパス – assets配下とpublic配下 – | Boys Be Engineer 非エンジニアよ、エンジニアになれ
image_tagメソッドを使ったイメージタグの作成 - Ruby on Rails入門
- 投稿日:2019-10-01T21:21:31+09:00
【Rails】【docker-compose】Railsサーバーが立ち上がらなかった場合の対処方法
Railsサーバーが立ち上がらなくてつまずいたのでメモ。
Docker初心者です。現象
docker-compose up -d
でコンテナを起動しようとしたら何故か立ち上がらない・・・。
docker-compose up
やdocker-compose start
を試してみたけれどlocalhost:3000で表示されず。
docker-compose ps
(コンテナの確認)を実行してみると、どうやら「project_web_1」のステータスがExit 1
となっているのが原因っぽい。Name Command State Ports ----------------------------------------------------------------------------- project_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp project_web_1 bundle exec rails s -p 300 ... Exit 1
docker logs task_webserver_1
を実行すると以下のログが表示された。
※ここでdocker
をdocker-compose
にしていたので全然表示されなかった。。=> Booting Puma => Rails 5.2.3 application starting in development => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.12.1 (ruby 2.6.4-p104), codename: Llamas in Pajamas * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop Started GET "/" for 172.21.0.1 at 2019-09-30 10:46:07 +0000 Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 (0.5ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 ↳ /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Processing by Rails::WelcomeController#index as HTML Rendering /usr/local/bundle/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb Rendered /usr/local/bundle/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb (5.2ms) Completed 200 OK in 28ms (Views: 22.1ms | ActiveRecord: 0.0ms) Started GET "/" for 172.21.0.1 at 2019-09-30 11:39:02 +0000 Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 (0.5ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 ↳ /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Processing by Rails::WelcomeController#index as HTML Rendering /usr/local/bundle/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb Rendered /usr/local/bundle/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb (1.6ms) Completed 200 OK in 6ms (Views: 4.5ms | ActiveRecord: 0.0ms) Started GET "/" for 172.21.0.1 at 2019-09-30 13:21:17 +0000 Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 (0.5ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 ↳ /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Processing by Rails::WelcomeController#index as HTML Rendering /usr/local/bundle/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb Rendered /usr/local/bundle/gems/railties-5.2.3/lib/rails/templates/rails/welcome/index.html.erb (1.6ms) Completed 200 OK in 4ms (Views: 3.4ms | ActiveRecord: 0.0ms) Started GET "/home/top/" for 172.21.0.1 at 2019-09-30 13:21:23 +0000 Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by HomeController#top as HTML Rendering home/top.html.erb within layouts/application Rendered home/top.html.erb within layouts/application (0.3ms) Completed 200 OK in 2242ms (Views: 2226.3ms | ActiveRecord: 0.0ms) Started GET "/home/top/" for 172.21.0.1 at 2019-09-30 13:21:40 +0000 Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by HomeController#top as HTML Rendering home/top.html.erb within layouts/application Rendered home/top.html.erb within layouts/application (0.4ms) Completed 200 OK in 149ms (Views: 131.7ms | ActiveRecord: 0.0ms) Started GET "/home/top/" for 172.21.0.1 at 2019-09-30 13:30:56 +0000 Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 (0.9ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 ↳ /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Processing by HomeController#top as HTML Rendering home/top.html.erb within layouts/application Rendered home/top.html.erb within layouts/application (0.9ms) Completed 200 OK in 124ms (Views: 108.3ms | ActiveRecord: 0.0ms) Started GET "/home/top/" for 172.21.0.1 at 2019-09-30 13:31:00 +0000 Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by HomeController#top as HTML Rendering home/top.html.erb within layouts/application Rendered home/top.html.erb within layouts/application (0.4ms) Completed 200 OK in 129ms (Views: 113.8ms | ActiveRecord: 0.0ms) - Gracefully stopping, waiting for requests to finish === puma shutdown: 2019-09-30 14:23:32 +0000 === - Goodbye! Exiting => Booting Puma => Rails 5.2.3 application starting in development => Run `rails server -h` for more startup options A server is already running. Check /app/tmp/pids/server.pid. Exiting => Booting Puma => Rails 5.2.3 application starting in development => Run `rails server -h` for more startup options A server is already running. Check /app/tmp/pids/server.pid. Exiting => Booting Puma => Rails 5.2.3 application starting in development => Run `rails server -h` for more startup options A server is already running. Check /app/tmp/pids/server.pid. Exiting => Booting Puma => Rails 5.2.3 application starting in development => Run `rails server -h` for more startup options A server is already running. Check /app/tmp/pids/server.pid. Exiting => Booting Puma => Rails 5.2.3 application starting in development => Run `rails server -h` for more startup options A server is already running. Check /app/tmp/pids/server.pid. Exitingメチャクチャ長文・・・。
とりあえずA server is already running. Check /app/tmp/pids/server.pid.
の文がやたらとあったので、調べてみた。すると以下の方の記事に遭遇。
【docker-compose】Railsサーバが起動しない場合の対処法 - Qiitaほぼ一緒の現象でしたので「これだ!」と思い参考にさせていただきました。
記事どおり
tmp/pids/server.pid
を削除してdocker-compose up -d
で再度起動。
無事表示されました。これ覚えておこう。
参考サイト
途中で参考になった記事です。
DockerでRuby on Railsの開発をしよう - Qiita
- 投稿日:2019-10-01T19:20:35+09:00
配列の基本
はじめに
rubyの参考書で勉強をはじめたので、
自分の思考の整理、メモとして配列に関しての基礎的なことを書きます。
terminal
にてirb
と打つことでコードを試すことができる。exit
で終了- 拡張子.rbのファイルにコードを記述して
terminal
にてruby ファイル名
でコードを実行できる。puts
p
で表示できる。jsで言うところconsole.log()
- コメントアウトは
#
生成 取得 追加 更新 削除
- 生成
array = [] # [] array = [1,2,3] # [1,2,3]
- 連番
範囲オブジェクトを利用 (first..last)
.to_a
で配列(Array)にできる
*範囲オブジェクト
「..」演算子の左辺に最初の値を指定し右辺に最後の値を指定します。最初と最後の値には数値や文字列などのオブジェクトが指定可能(1..5).to_a # [1,2,3,4,5]
- 取得
配列[index]の形式array = ["a","b","c",nil] p array[0] #"a"
- 追加
使用してないindexを指定して代入
push()を使用 末尾に追加
<<
を使用array = ["a","b","c","d"] array[4] = "e" p array #["a", "b", "c", "d", "e"] array.push("f") p array #["a", "b", "c", "d", "e", "f"] array << 'hoge' p array #["a", "b", "c", "d", "e", "f", "hoge"]
- 更新
更新したいindexを指定して代入array = ["a","b","c","d"] array[0] = "e" p array #["e", "b", "c", "d"]
- 削除
deleteメソッドを使用
引数に削除した要素を指定 indexを指定、空の配列を代入することで削除も可能array = ["a","b","c","d","f"] array.delete("a"); p array #["b", "c", "d","f"] #[index番号, 削除する個数]で指定 array[0,3] = [] p array #["f"]insert 挿入
第一引数に挿入するindex
第二引数に挿入する要素を指定array = (1..5).to_a array.insert(3,777) p array # [1, 2, 3, 777, 4, 5]concat 配列の結合
引数に結合したい配列を指定
arrayA = ["a", "b", "c"] arrayB = ["d", "e", "f"] arrayA.concat(arrayB) p arrayA #["a", "b", "c", "d", "e", "f"]join 結合した文字列の作成
引数に結合する際に使用するものを指定できる
array = ['ruby','javascript','php','python'] newArray = array.join(',') p newArray #"ruby,javascript,php,python"map 処理を加えて、新しい配列を生成
|a|
の部分に配列の各要素が渡されて処理される。array = (1..5).to_a def map_test(array) array.map do |a| a*2 end end newArray = map_test(array) p newArray p array #[2, 4, 6, 8, 10] #[1, 2, 3, 4, 5]select 選択 絞り込み
array = (1..12).to_a p array.select {|a| a % 2==0} #[2, 4, 6, 8, 10, 12]uniq 重複の削除
array = [1,1,2,2,2,3,4,4,5,8] p array.uniq #[1, 2, 3, 4, 5, 8]length size count 要素の数をかぞえる
- length sizeは基本的に同じ
array = ["a","b","c"] str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." p array.length p str.length #3 #123
- count
引数を条件として、条件に合った要素の数だけを取得array = ["a","b","c"] p array.count("a"); #1nil(無)を除いた要素数を数える
array = ["a","b","c",nil] p array.size p array.count{ |num| !num.nil? } #4 #3push pop unshift shift
- push 末尾に追加
- pop 末尾を削除
array = ["a","b","c","d","e"] array.push(1); p array #["a", "b", "c", "d", "e", 1] array.pop p array #["a", "b", "c", "d", "e"]
- unshift 先頭に追加
- shift 先頭を削除
array = ["a","b","c","d","e"] array.unshift(1); p array #[1, "a", "b", "c", "d", "e"] array.shift p array #["a", "b", "c", "d", "e"]reverse reverse! 反転
reverseは反転して新しい配列を返す
reverse!は指定した配列そのものを判定して返すarray = ["a","b","c","d","e"] newArray = array.reverse p array p newArray #["a", "b", "c", "d", "e"] #["e", "d", "c", "b", "a"] array.reverse! p array #["e", "d", "c", "b", "a"]sort sort_by 並び替え
- sort
新しい配列を返す
|a, b| の指定の仕方で昇順と降順を設定
昇順
a <=> b
降順
b <=> a
降順の場合、 bがaより大きいときに1を返し、bがaより小さいときに-1を返す。bとaが等しいときは0を返す。 この返り値により、sortはbが大きいときはそのまま、bが小さいときはaと順番を入れ替る。bとaが等しいときにも何もしない挙動となる。array = [4,7,8,2,8,3,5,0,9,1,3] newArray = array.sort p newArray #[0, 1, 2, 3, 3, 4, 5, 7, 8, 8, 9]array = [4,7,8,2,8,3,5,0,9,1,3] newArray = array.sort{|a ,b| b<=>a} p newArray
- sort_by
|a|
の部分に並び替えの条件を設定できるarray = ['ruby','javascript','php','python'] newArray = array.sort_by{|a| a.size} p newArray #["php", "ruby", "python", "javascript"]降順には
reverse
を使うarray = ['ruby','javascript','php','python'] newArray = array.sort_by{|a| a.size}.reverse p newArray #["javascript", "python", "ruby", "php"]まだまだありますが、とりえあえずここで止めます。
次は配列の繰り返し処理についてまとめたいと思います。
- 投稿日:2019-10-01T17:58:21+09:00
【Rails】Stripeの実装(カード情報保存版)
環境
- Rails 5.2.3
- stripe-ruby 4.21.3
ドキュメント(Stripe公式)
設定
KEYの設定(環境変数)
initializersの設定
コンソールでテスト
テスト結果は、stripeのダッシュボードで確認可能。
※ユーザ固有のキーを使っている場合のみ。
※ダッシュボードで 「テストデータを表示」 をチェックすること。リクエスト例
- amountはドル換算で 50セント以上になるようにする(50セント未満の場合、exceptionが発生する)。
- tokenは以下の何れかを参照 (※以下の例では
tok_mastercard
を使用している)。
- https://stripe.com/docs/testing#cards
- https://stripe.com/docs/testing#international-cards (※
currency
としてjpy
を使う場合はこっち。但し、テストなのでどちらもで良い)## customer の作成 customer = Stripe::Customer.create({ source: 'tok_mastercard', email: 'paying.user@example.com', }) ## customer にチャージする (カードではなく) charge = Stripe::Charge.create({ amount: 1000, currency: 'jpy', customer: customer.id, }) ## customer ID (customer.id) や、その他の情報をデータベースに保存する。 ## 再度、customer にチャージする際に、↑で保存した customer ID を使う。以下の customer_id はデータベースに保存していたもの。 charge = Stripe::Charge.create({ amount: 1500, currency: 'jpy', customer: customer_id, })レスポンス例(↑の例では
customer
に入るもの)> customer.class => Stripe::Customer < Stripe::APIResource > customer.id => "cus_FuW98aPiB42PLY" > customer => { :id => "cus_FuW98aPiB42PLY", :object => "customer", :account_balance => 0, :address => nil, :balance => 0, :created => 1569920002, :currency => nil, :default_source => "card_1FOh6k2eZvKYlo2C86LDl8BE", :delinquent => false, :description => nil, :discount => nil, :email => "paying.user@example.com", :invoice_prefix => "032DE63F", :invoice_settings => { :custom_fields => nil, :default_payment_method => nil, :footer => nil }, :livemode => false, :metadata => {}, :name => nil, :phone => nil, :preferred_locales => [], :shipping => nil, :sources => { :object => "list", :data => [ [0] { :id => "card_1FOh6k2eZvKYlo2C86LDl8BE", :object => "card", :address_city => nil, :address_country => nil, :address_line1 => nil, :address_line1_check => nil, :address_line2 => nil, :address_state => nil, :address_zip => nil, :address_zip_check => nil, :brand => "MasterCard", :country => "US", :customer => "cus_FuW98aPiB42PLY", :cvc_check => nil, :dynamic_last4 => nil, :exp_month => 10, :exp_year => 2020, :fingerprint => "7a9bk9ncM08SXfua", :funding => "credit", :last4 => "4444", :metadata => {}, :name => nil, :tokenization_method => nil } ], :has_more => false, :total_count => 1, :url => "/v1/customers/cus_FuW98aPiB42PLY/sources" }, :subscriptions => { :object => "list", :data => [], :has_more => false, :total_count => 0, :url => "/v1/customers/cus_FuW98aPiB42PLY/subscriptions" }, :tax_exempt => "none", :tax_ids => { :object => "list", :data => [], :has_more => false, :total_count => 0, :url => "/v1/customers/cus_FuW98aPiB42PLY/tax_ids" }, :tax_info => nil, :tax_info_verification => nil }レスポンス例(↑の例では
charge
に入るもの)> charge.class => Stripe::Charge < Stripe::APIResource > charge => { :id => "ch_1FOh8a2eZvKYlo2CqJvuzqx2", :object => "charge", :amount => 1000, :amount_refunded => 0, :application => nil, :application_fee => nil, :application_fee_amount => nil, :balance_transaction => "txn_1FOh8b2eZvKYlo2C0J9XmWSz", :billing_details => { :address => { :city => nil, :country => nil, :line1 => nil, :line2 => nil, :postal_code => nil, :state => nil }, :email => nil, :name => nil, :phone => nil }, :captured => true, :created => 1569920116, :currency => "jpy", :customer => "cus_FuW98aPiB42PLY", :description => nil, :destination => nil, :dispute => nil, :failure_code => nil, :failure_message => nil, :fraud_details => {}, :invoice => nil, :livemode => false, :metadata => {}, :on_behalf_of => nil, :order => nil, :outcome => { :network_status => "approved_by_network", :reason => nil, :risk_level => "normal", :risk_score => 34, :seller_message => "Payment complete.", :type => "authorized" }, :paid => true, :payment_intent => nil, :payment_method => "card_1FOh6k2eZvKYlo2C86LDl8BE", :payment_method_details => { :card => { :brand => "mastercard", :checks => { :address_line1_check => nil, :address_postal_code_check => nil, :cvc_check => nil }, :country => "US", :exp_month => 10, :exp_year => 2020, :fingerprint => "7a9bk9ncM08SXfua", :funding => "credit", :last4 => "4444", :three_d_secure => nil, :wallet => nil }, :type => "card" }, :receipt_email => nil, :receipt_number => nil, :receipt_url => "https://pay.stripe.com/receipts/acct_1032D82eZvKYlo2C/ch_1FOh8a2eZvKYlo2CqJvuzqx2/rcpt_FuWAT1u6h54pfgGz0uOTzqZbV8EgbPX", :refunded => false, :refunds => { :object => "list", :data => [], :has_more => false, :total_count => 0, :url => "/v1/charges/ch_1FOh8a2eZvKYlo2CqJvuzqx2/refunds" }, :review => nil, :shipping => nil, :source => { :id => "card_1FOh6k2eZvKYlo2C86LDl8BE", :object => "card", :address_city => nil, :address_country => nil, :address_line1 => nil, :address_line1_check => nil, :address_line2 => nil, :address_state => nil, :address_zip => nil, :address_zip_check => nil, :brand => "MasterCard", :country => "US", :customer => "cus_FuW98aPiB42PLY", :cvc_check => nil, :dynamic_last4 => nil, :exp_month => 10, :exp_year => 2020, :fingerprint => "7a9bk9ncM08SXfua", :funding => "credit", :last4 => "4444", :metadata => {}, :name => nil, :tokenization_method => nil }, :source_transfer => nil, :statement_descriptor => nil, :statement_descriptor_suffix => nil, :status => "succeeded", :transfer_data => nil, :transfer_group => nil }エラー処理
独自Exception
モック
実装時の注意点
- 投稿日:2019-10-01T17:54:14+09:00
Rubyの基本操作
- 投稿日:2019-10-01T15:00:06+09:00
git pushでherokuにデプロイしようとしたらfatal: unable to accessとなった
herokuにログインしてなかっただけだった。
$heroku login
でログインした。
その後は別のエラーにつまづいたが、、、
備忘録。
- 投稿日:2019-10-01T12:44:51+09:00
elasticsearch-ruby で FrozenError が出たので対処した
何が起きたか
以下の
force_encoding
実行時にbody
が凍結されていたようで、 FrozenError が発生した。# Licensed to Elasticsearch B.V under one or more agreements. # Elasticsearch B.V licenses this file to you under the Apache 2.0 License. # See the LICENSE file in the project root for more information module Elasticsearch module Transport module Transport # Wraps the response from Elasticsearch. # class Response attr_reader :status, :body, :headers # @param status [Integer] Response status code # @param body [String] Response body # @param headers [Hash] Response headers def initialize(status, body, headers={}) @status, @body, @headers = status, body, headers @body = body.force_encoding('UTF-8') if body.respond_to?(:force_encoding) end end end end end前提
- Ruby 2.6.1
- AWS Elasticsearch Service Engine version 7.1
- elasticsearch-ruby 7.3
- faraday 0.16.2
なぜ凍結されているか
すいません、調査していません。ググっても情報が出てこないので、この組み合わせだと発生するのかなーと。
対処内容
Faraday の Middleware を実装して対処しました。
require "faraday" # Elasticsearch::Transport::Transport::Response で body.force_encoding の際に # FrozenError が発生するため、body を解凍するミドルウェアをかませる。 module Faraday class Response class Unfreeze < Middleware def parse(body) +body # 解凍 end end register_middleware unfreeze: Unfreeze end end上記ミドルウェアを
Elasticsearch::Client
の初期化時に追加。ES = Elasticsearch::Client.new(url: url) do |faraday| faraday.request(:aws_sigv4, service: 'es', region: aws_region, credentials_provider: credentials_provider) faraday.response :unfreeze # <= ここに追加 faraday.adapter Faraday.default_adapter endこれで上手くいきました。
- 投稿日:2019-10-01T11:30:47+09:00
rails new してから git commit -m 'first commit' までの手順まとめ
はじめに
技術検証とかで新たに rails プロジェクトを作成する際に、毎回同じようなコマンドを叩いていたのでまとめてみました。
こんなことやらずに docker を使えって言われたらそれはそうなんですが、それはそれ。試したバージョン情報
- rbenv: 1.1.2
- Ruby: 2.6.4
- Rails: 6.0.0
実行すること
プロジェクトファイルの作成
$ mkdir new_project $ cd new_projectruby最新化
$ brew update && brew upgrade ruby-build # 0.0.0 には latest version を入れる(latest versionはググる) $ rbenv install 0.0.0 # 0.0.0 には latest version を入れる $ rbenv local 0.0.0rails のセットアップ
$ bundle init # 0.0.0 には latest version を入れる $ echo 'gem "rails", ">=0.0.0(latest version)"' >> Gemfile $ bundle install --path vendor/bundle # optionとして ` --api --skip-test --skip-turbolinks --skip-coffee` などを指定。 # ここでは `--skip-turbolinks` を例で使用していますが turbolinks が憎いわけではありません。 # その他の option は、 `rails new -h` で確認。 $ bundle exec rails new . --skip-turbolinksgit の設定
$ git init # gitignore は次のものををそのままコピペ `https://github.com/github/gitignore/blob/master/Rails.gitignore` $ vim .gitignore $ git add . $ git commit -m 'first commit'終わり
- 投稿日:2019-10-01T09:33:21+09:00
Railsのblank?が優秀だった
背景
Railsでアプリケーションを作っていて、空文字判定の実装をしました。
当然blank?
を使用したわけですが、思ったより優秀で驚いた話です。String.blank? の動作
空文字
一番ベーシックなタイプです。これは当然true。
irb(main):001:0> ''.blank? => true半角スペース
これも可能なら対応してもらいたいところだが... → true
irb(main):002:0> ' '.blank? => true半角スペース(複数)
これはブランクと言えるのか...? → true
irb(main):003:0> ' '.blank? => true全角スペース
これは流石に... → true
irb(main):004:0> '\U+FFE3'.blank? => true全角スペース(複数)
もうわかってきた。これはtrue! → true
irb(main):005:0> '\U+FFE3\U+FFE3\U+FFE3\U+FFE3'.blank? => true改行
まさかこれも...? → true
irb(main):014:0> ' irb(main):015:0' '.blank? => true全角スペース + 改行
falseにしたい...! → true
irb(main):022:0> ' irb(main):023:0' \U+FFE3 irb(main):024:0' irb(main):025:0' '.blank? => true文字列「aaa」
少し心配になってきたので、念のため... → false
irb(main):006:0> 'aaa'.blank? => falseRubyのメソッドではなくて、Railsで実装されている
これはrailsで実装されているのであって、Rubyでは使えません。
irb(main):001:0> ''.blank? Traceback (most recent call last): 2: from /Users/yoshinori/.rbenv/versions/2.5.3/bin/irb:11:in `<main>' 1: from (irb):1 NoMethodError (undefined method `blank?' for "":String)終わりに
文字列か有効かどうか判断するのに 'blank?' が優秀なことがわかりました。
'present?' は 'blank?' の真逆になります。
すごく便利。