20191001のRubyに関する記事は12件です。

【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ファイルのパス --delete

Slim基本文法

<>が不要、や<% 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の基本文法でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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環境を整える

さっそく他人様まかせで申し訳ないですが

とても、とても素晴らしい記事があるので
ほぼこれを参考にやっていきます...

※一部別の方法でインストールする部分があるのでリンク先とこの記事を見比べながら作業してください。
(一個一個のインストールに割と時間かかるので気長に待ちましょう。特に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 ~/.bashrc

vim の使い方はこちらでどうぞ

- 知識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/mysql

MySQLが起動中だとうまく全ファイルを消せないので、

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 アプリの名前 移動先 -r

vscodeを起動

ファイル > フォルダを開く > 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) で確認出来たら終了です!

お疲れさまでした。

a.jpg

参考
- Ruby on RailsでMySQLを使用・接続する際の手順と注意点
- RailsのDBを(初めから| |後から)MySQLに変更する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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.slim
  section.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

ブラウザでは以下のようになる
スクリーンショット 2019-10-01 午後10.21.01.png
これではUIが良くないためスタイルを整える必要がある

インデント、Spectreを使いスタイルを整える

hoge.html.slim
  section.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-01 午後10.36.48.png
これでUIが良くなり、CSSをあてる手間も省ける

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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入門

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】【docker-compose】Railsサーバーが立ち上がらなかった場合の対処方法

Railsサーバーが立ち上がらなくてつまずいたのでメモ。
Docker初心者です。

現象

docker-compose up -dでコンテナを起動しようとしたら何故か立ち上がらない・・・。
docker-compose updocker-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を実行すると以下のログが表示された。
※ここでdockerdocker-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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

配列の基本

はじめに

rubyの参考書で勉強をはじめたので、
自分の思考の整理、メモとして配列に関しての基礎的なことを書きます。

  • terminalにてirbと打つことでコードを試すことができる。exitで終了
  • 拡張子.rbのファイルにコードを記述してterminalにてruby ファイル名 でコードを実行できる。
  • puts pで表示できる。jsで言うところconsole.log()
  • コメントアウトは#

ruby 繰り返し処理 基本操作まとめ

生成 取得 追加 更新 削除

  • 生成
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");

#1

nil(無)を除いた要素数を数える

array  = ["a","b","c",nil]
p array.size
p array.count{ |num| !num.nil? }

#4
#3

push 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"]

まだまだありますが、とりえあえずここで止めます。
次は配列の繰り返し処理についてまとめたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】Stripeの実装(カード情報保存版)

環境

ドキュメント(Stripe公式)

設定

KEYの設定(環境変数)

こちらを参照。

initializersの設定

こちらを参照。

コンソールでテスト

テスト結果は、stripeのダッシュボードで確認可能。
※ユーザ固有のキーを使っている場合のみ。
※ダッシュボードで 「テストデータを表示」 をチェックすること。

リクエスト例

## 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

こちらを参照。

モック

こちらを参照。

実装時の注意点

こちらを参照。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyの基本操作

Rubyファイルを実行する

ディレクトリまで移動して、rubyを頭につけて実行するだけ

~/environment/app (master) $ ruby rubyfile.rb
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

git pushでherokuにデプロイしようとしたらfatal: unable to accessとなった

herokuにログインしてなかっただけだった。

$heroku login

でログインした。

その後は別のエラーにつまづいたが、、、
備忘録。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

https://github.com/elastic/elasticsearch-ruby/blob/ccece45a29cc40456a812c23a0f025c5bcfbb33a/elasticsearch-transport/lib/elasticsearch/transport/transport/response.rb#L19

前提

  • 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

これで上手くいきました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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_project

ruby最新化

$ 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.0

rails のセットアップ

$ 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-turbolinks

git の設定

$ git init

# gitignore は次のものををそのままコピペ `https://github.com/github/gitignore/blob/master/Rails.gitignore`
$ vim .gitignore

$ git add .

$ git commit -m 'first commit'

終わり

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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?
=> false

Rubyのメソッドではなくて、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?' の真逆になります。
すごく便利。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む