Ruby関連のことを調べてみた2019年11月29日

Ruby関連のことを調べてみた2019年11月29日

【Ruby】配列のnilチェック+部分一致検索

Rubyの超初心者(自分)向けの備忘録

## やりたいこと
1. Rubyハッシュ(連想配列)のnilチェック
2. 配列の部分一致検索

### 1. Rubyのハッシュ(連想配列)のnilチェック

– 最初はif文でnilチェックをやろうと思ったけど、以下のように`dig()`を使う方が簡単だった
(Ruby2.3で導入されたらしい)

“`ruby
params.dig(:q, :name)
“`

### 2. 配列の部分一致検索

“`ruby
search_text = ‘検索したい文字’
array.select { |e| e =~ %r{^.*#{search_text}.*} }
“`

– `#{}`で囲うとで変数を入れられる
– `%r{}`で正規表現オブジェクトを作成した場合、パターン内に「/」が含まれていてもエスケープは不要らしい。便利!

「もっとこうした方が楽だよ!」と言った知見があれば、コメントお待ちしてます

## 参考サイト
– [サンプルコードでわかる!Ruby 2.3の主な新機能 – Qiita](https://qi

元記事を表示

#Rails ( #Ruby + ActiveSupport ) + Time.use_zone + travel_to で現地時刻=日本時刻=JSTを固定して UTC 変換結果を見て遊ぶ例

– タイムゾーンの9時間の扱いを一生かかっても覚えられる気がしない
– 足し算と引き算を間違える確率が65%
– Rubyで遊んでいたらだんだん分かってきた気がするけれど
– タイムゾーンに慣れ親しむだけで1週間かかって、3日で忘れる気がした

“`rb
require ‘active_support/core_ext’

# 日本時間の年始の時間
jst_beggining_of_year = Time.use_zone(‘Tokyo’) { Time.local(2020, 01, 01, 00, 00, 00) }

# travel するために必要
require ‘active_support/testing/time_helpers’
include ActiveSupport::Testing::TimeHelpers

# 日本時間の年始に時間を固定する
travel_to jst_beggining_of_year

# 今日の日付は 2020-01-01
Date.current
# => Wed, 01 Jan 2020

# 現在時刻は 2020-01-01

元記事を表示

#Ruby と #Rails の Time や Time.zone の扱いががマジで分からないし混沌としてるのでちょっとだけ整理したい。

# Try at

この時間に試しました

– JST 2019-11-28 hour 19
– UTC 2019-11-28 hour 10

# For Ruby

`require ‘active_support/core_ext’`

# No Time zone setting

タイムゾーン指定がないとメソッドが使えなかったり

“`rb
Time.zone
# nil

Time.zone.now
# NoMethodError: undefined method `now’ for nil:NilClass
“`

# Timezone指定

Time.zone は ActiveSupportのインスタンスになる
タイムゾーンを切り替えるには `Time.zone=` メソッドを実行

Railsであればapplication.rb の configに書くだろうが

タイムゾーン指定自体は `Tokyo` でも `Asia/Tokyo` でも同じようにはからってくれるっぽい
ちなみに `Time.zone = ‘JST’` じゃ動かないとか信じられるかい

“`

元記事を表示

Railsでのjoinsの結果のidについて

Railsでテーブル結合してデータを取得した時、idを参照元の主キーにしたいのに参照先の主キーになってしまっていた。
結論として

“`
Hoge.joins(:fuga).where(fuga_name:”hoge”).select(“fuga.*,hoge.*”)
“`
このようにselectで最後に指定したテーブルの主キーが結合したデータの主キーとなる。

元記事を表示

email_fieldの入力フォームに初期値を反映させる方法

#bootstrapを使用しながらemail_fieldの入力フォームに初期値を反映させる方法。
ポートフォリオを採用側に見てもらう時少しでも手間を省くため、ワンクリックで済むようにと初期値設定を考えました。
text_fieldは大量に検索ヒットしたけどemail_fieldとpassword_fieldは出てこなくて苦戦したので、自分用メモとして。

“`ruby:new.html.erb
<%= form_with(url: login_path, scope: :session, local: true) do |f| %>

<%= f.label :email, 'メールアドレス' %>
<%= f.email_field :email, class: 'form-control', placeholder: 'hoge@gmail.com' %>
<%= f

元記事を表示

#Ruby で #Rails と同じ Time.zone.now を使う

– activesupportをinstall & require する
– Time.zone を指定する
– あとは Rails と同じようにする

“`
gem install activesupport
“`

“`rb
require ‘active_support/core_ext’
# => true

Time.zone
# => nil

Time.zone = ‘Tokyo’
# => “Tokyo”

Time.zone
# => #, @utc_offset=nil>

Time.zone.now
# => Thu, 28 Nov 2019 17:41:36 JST +09:00
“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2773

元記事を表示

#Ruby / #Rails で日付を UTC あるいは local時刻 = JSTなどで time に変換するにはするには引数を指定せよ

# Rails

“`rb
Date.parse(‘2020-01-01’).to_time(:utc)
# => 2020-01-01 00:00:00 UTC

Date.parse(‘2020-01-01’).to_time(:local)
# => 2020-01-01 00:00:00 +0900

“`

# Ruby の場合はgem installが必要

“`
gem install activesupport
“`

“`
require ‘active_support/date’
require ‘active_support/core_ext’
“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2772

元記事を表示

AndroidのlogcatをTSV形式に加工するrubyスクリプト

Androidのlogcatを解析する際にExcelやgoogleスプレッドシートに貼り付けて、
フィルタ機能を使って一部のログのみ抽出して表示したいので作ってみました。

## 変換スクリプト

“`ruby:locat2tsv.rb
#!/usr/bin/env ruby

while line = ARGF.gets
(date, time, pid_package, level_tag, message) = line.split(” “,5)
(pid, package) = pid_package.split(“/”)
(level, tag) = level_tag.split(“/”)

data = [“#{date} #{time}”, pid, package, level, tag, message]
puts data.join(“\t”)
end
“`

## 変換結果をgoogleスプレッドシートに貼り付けた例

スクリーンショット 2019-11-29 0.17.59.png[Ruby] 無限フィボナッチ

# 無限フィボナッチ

Yo! クリぼっちでも [フィボナッチ](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)! :sunglasses:

## 旧コード

大好きな DelegateClass と Enumerator を組み合わせて書いてみた。後で書き直しました (後述) 。

“`rb
class FibonacciNumbers < DelegateClass(Enumerator) def initialize super(fibonacci_numbers) end private def fibonacci_numbers Enumerator.new do |y| memo = [0, 1] loop.with_index do |_, i| if i < 2 y << memo[i] else

元記事を表示

Ruby 初歩的な比較演算時まとめ

# 目的

– Rubyのif文などで使用する比較演算子をメモ程度にまとめる

# 比較演算子記載方法まとめ

|比較演算子 |意味 |
|—|—|
|A < B |AがBより小さい | |A <= B |AがB以下 | |A > B |BがAより小さい |
|A >= B |BがA以下 |
|A == B |AがBと等しい |
|A != B |AがBと異なる |

# 書き方の例

– 下記に比較演算子を用いた簡単な条件分岐処理を記載する。

“`ruby
# 変数格納
age = 23

if age >= 20
puts “成人しています”
end
“`

元記事を表示

Ruby技術者認定試験対策 | 破壊的メソッド一覧(!がつくメソッドのみ)

“`ruby
Class.instance_methods(false).grep(/.*!/)
“`
これを各クラスに行いビックリマークがつく破壊的メソッドを全て取得して、以下に一覧としてまとめておきます。
それぞれのメソッドにリファレンスのリンクを付与しています。
(非公式ですがAmiWikiのほうが自分はわかりやすいと思ったのでAmiWikiをチョイスしています。AmiWikiにないものは、るりまサーチにしています。)

## Array
“`ruby
=> [:reverse!, :rotate!, :sort!, :sort_by!, :collect!, :map!, :select!, :reject!, :slice!, :uniq!, :compact!, :flatten!, :shuffle!]
“`

* [reverse!](https://ref.xaio.jp/ruby/classes/array/reverse)
* [rotate!](https://ref.xaio.jp/ruby/classes/array/rotate)
* [sort!

元記事を表示

Rubyの数値について少し詳しく備忘録

### 10進数以外の整数リテラル

2進数の場合は0b、8進数の場合は0xを先頭につけると、それぞれ10進数以外の整数値を作成することができる!

“`ruby:10進数以外の整数リテラル
# 2進数
0b11111111 #-> 255

# 8進数
0377 #->255

# 16進数
0xff #->255
“`

### 数値クラス
Ruby2.3までの整数は、Bignum、Fixnumクラスに別れていましたが、Ruby2.4以降は全てIntegerクラスにまとめられた!

この他にも有理数を表すRationalクラスや、複素数を表すComplexクラスがある。

“`ruby:有理数と複素数

# 有理数
r = 2 / 3r
r #->(2/3)
r.class #->Rational

# 複素数
c = 0.3 – 0.5i
c #->(0.3-0.5i)
c.class #->Complex
“`

小数クラスのFloatクラスも含め、数値クラスは全てNumericクラスのサブクラス!

元記事を表示

コードを和訳する②(chomp,function,def)

#はじめに
[前回の記事](https://qiita.com/Moon1126Snow/items/5b2b8f28436b8dc3595b)が思いのほか書くのが楽しかったので、続けざま書いてみます。
#実行

まずはRubyの次のコードです。

“`ruby
num = gets.chomp.to_i
“`

入力した数字をnumに代入するコードです。
このうち`gets`は`理解する、入手する`といった意味があります。
そして`chomp`は`むしゃむしゃ食べる`という意味があります。
このコードは、言ってみれば***人間の言葉を機会の言葉に翻訳する処理***とも言えるので、
`入力された人間の言葉を咀嚼して、機械にも理解できるようにする`という意味合いだと予想できます。

続いては、JavaScriptの関数に使われている`function`です。

“`javascript
function Say(Hello){
console.log(Hello);
}
“`
といった具合に使われます。

functionはそのまま`関数、機能`という意味があるので、特に解

元記事を表示

コードを和訳する①(Hello World)

#はじめに
プログラミング言語というのは大体英語です。
[こういう記事](https://wired.jp/2019/08/04/coding-is-for-everyoneas-long-as-you-speak-english/)(Qiita外記事)があるくらい、とにかく英語で書かれています。
割と簡単な単語もあれば、辞書を引かないとわからないような単語もあります。
そして、実際に意味を調べると、コードの意味がよくわかることもあります。

本記事では、過去の記事で書いたコードにある英単語を和訳してみて、解りやすくなるのか…わけがわからなくなるのか…それとも笑える感じになるのか、そういったことを試してみます。

#実行
どんなプログラムでも最初に勉強することは`Hello World`と出力することですが、RubyとJavaScriptではそれぞれ次のようにコードを書きます。

“`ruby
puts “Hello World”
“`

“`javascript
console.log(Hello World)
“`

まず`puts`の方ですが、goo辞書で調べてみると`暴

元記事を表示

[ruby2.5~] 文字列中の先頭, 末尾から特定文字を一つだけ消す

特定の文字を先頭から見つかった最初だけ、末尾から見つかった一つだけ消したいニーズがあった
gsubやdeleteだと下記の様に見つかった全部の文字を消してしまうので使えない

“`ruby
‘中野区東中野’.gsub(‘中野’, ”)
=> “区東”
‘中野区東中野’.delete(‘中野’)
=> “区東”
“`

地味に面倒な記憶があったけれど、ruby2.5から`delete_suffix`, `delete_prefix`というメソッドが追加されていた

“`ruby
‘中野区東中野’.delete_prefix(‘中野’)
=> “区東中野”
‘中野区東中野’.delete_suffix(‘中野’)
=> “中野区東”
“`

破壊的メソッドも用意されているらしい。便利!

参考
https://docs.ruby-lang.org/ja/latest/method/String/i/delete_suffix.html
https://docs.ruby-lang.org/ja/latest/method/String/i/delete_prefix.html

元記事を表示

has_many_attachedなActiveStorageに属性を付与する

とあるModelに複数のファイルをAttachさせるときに、
`ActiveStorage` の `has_many_attached` を使うことはよくあると思いますが、
このとき、

– ファイルに属性を付与したい
– 同じ属性のファイルが既にあるなら削除したい

的な感じの気持ちが溢れ出ると思います。

ので、やります。

“`ruby
class Foo < ApplicationRecord has_many_attached :bars end ``` このクラスで何かをattachします ```ruby class Foo < ApplicationRecord has_many_attached :bars def attach_bars bar = 'something' #何らか適当なファイル的なやつ bars.attach( io: StringIO.new(bar), filename: 'なんらかてきとうなふぁいるめい.txt', content_type: 'text/plain',

元記事を表示

【Rails】CSVファイルからデータをインポート

簡単なTODOアプリに、CSVファイルからタスクを追加する機能を実装します。
手順は以下の記事で説明されているものとほとんど同じです。めちゃくちゃ参考になりました。
[【Ruby on Rails】CSVインポート](https://qiita.com/seitarooodayo/items/c9d6955a12ca0b1fd1d4)
##実装
タスク追加、編集、削除機能、ログイン機能などを持つTODOアプリにCSVアップロード機能を実装して行きます。
[Ruby on Railsで簡単なアプリを作成](https://qiita.com/d0ne1s/items/5e63dde992f20f25b8bb)
[【Rails】ログイン機能を実装する](https://qiita.com/d0ne1s/items/7c4d2be3f53e34a9dec7)
###rubyの標準ライブラリ`csv`を追加
“`ruby:/config/application.rb
require ‘csv’
“`
###`roo`というgemを追加
csvファイルを読み込むためのgem`roo`を追加し

元記事を表示

さくらVPSでCentOS7 10.Ruby On Railsインストール

#はじめに
自由にテスト出来るLinuxのサーバーがほしくて、さくらVPSで構築してみました。
順次手順をアップしていく予定です。

今回は、Ruby On Railsをインストールします。
どういった構成が正解かは判断がつきかねているのですが、今のところこんな感じです・・(^^;

#目次

1. [申し込み](https://qiita.com/Qsugi/items/9239f93f35967e567b5b)
2. [CentOS7インストール](https://qiita.com/Qsugi/items/4cc4ba9983191a306b19)
3. [SSH接続](https://qiita.com/Qsugi/items/45772c8a71a31bd0d3c8)
4. [Apache・PHPインストール](https://qiita.com/Qsugi/items/bf9740f31b4c42eaad91)
5. [MariaDBインストール](https://qiita.com/Qsugi/items/7798669338b555f4ea8d)
6. [FTP接続](

元記事を表示

RailsのDM一覧に最後のメッセージを表示させる方法

#はじめに
[記事①](https://qiita.com/nojinoji/items/2b3f8309a31cc6d88d03)と[記事②](https://novice-programmer.com/dm_index/)を参考にDM機能を作らせていただきました。投稿してくださった方々に深く感謝いたします。
以下は[記事①](https://qiita.com/nojinoji/items/2b3f8309a31cc6d88d03)の通りにDM機能を作成した前提で進めます。

#やりたいこと
TwitterやLINEのようにメッセージの一覧に最後のメッセージを表記させる。

#実装
[記事①](https://qiita.com/nojinoji/items/2b3f8309a31cc6d88d03)通りに進めるとメッセージ一覧はrooms#indexに表示させることになると思うので、以下のようにすればユーザ間の最後のメッセージを引っ張ってくることができます。

まず、[記事②](https://novice-programmer.com/dm_index/)を参考にroomsコン

元記事を表示

コメントの削除も非同期で対応する

コメント投稿の非同期は成功しました。
そこで、コメント削除も非同期にて対応しようと思い。
クロームの検証画面でエレメントコピーして修正して下記コードを追加しました。
削除

コメントして即削除でActiveRecord::RecordNotFound in TweetsController#destroyが出ます。

一度リロードをすれば問題なく削除できているので
非同期部分で引っかかっているのは確認済みです。

どうすればいいのでしょうか?
コメント投稿と削除で別々の
コードがいるのでしょうか?
記載をするべきでしょうか?
何かファイルを増やしてそこに記載がいるのでしょうか?

“`js
$(function(){
function buildHTML(comment){
var html = `