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

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

.present?はnilかそうじゃないか、という場合は不要

キャンペーンコードから適用されるキャンペーンとプランに紐づくキャンペーンがあるんだけど、キャンペーンコードからのキャンペーンを配列の一番最初に表示させたかった時の実装。

辞書型(hash型)なのが注意。
`key`でキャンペーンコードからのものを探して一旦削除して`unshift`で先頭にpushしてるんだけどいまいち納得いってない。。もっといい方法ないのかな?

修正前

“`order_base_decorator.rb
def order_campaigns
c = options[‘campaigns’].to_a
cc = c.find{|x| x[“key”] == “campaign-code”}
c.delete(cc) if cc.present?
c.unshift(cc) if cc.present?
if c.present?
if c.first != {} && c[0][“key”] != “campaign-code”
return c.unshift({}).to_a

元記事を表示

【Ruby】NaNのNaNa不思議

これは [Ruby Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ruby)の18日目の記事です。[Otemachi\.rb \#17 \- connpass](https://enechange-meetup.connpass.com/event/129264/)で話した内容の大幅加筆修正版です。

**実用性は皆無**ですので、求めている方はブラウザバックしてください。

## NaN (Not a Number) とは
みなさん **NaN** ってご存知でしょうか?

NaNとは **Not a Number** の略で、日本語では非数といいます。主に浮動小数点演算の結果が不定形だったり未定義だったりするときに返ってきます。

[constant Float::NAN \(Ruby 2\.6\.0 リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/2.6.0/method/Float/c/NAN.html)

その数がNaNであるかどうかは、`Float#nan?

元記事を表示

Rails6でRSpecのコントローラテストをしようとするとエラーが発生する

## はじめに

下記の書籍を見ながら、勉強がてらアプリにテストを追加していましたが、
Rails6特有のエラーが発生しましたのでご紹介します。

RSpecを学ぶには最適の書籍だと思います。
[Everyday Rails – RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)

## 開発環境のバージョン

“`console
$ ruby -v
ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-darwin18]
$ rails -v
Rails 6.0.2
“`

`rspec-rails 3.9.0` を使用していました。

## 発生したエラー

下記のようなコントローラのスペックファイルを書いて実行すると、
警告とエラーが発生しました。

“`ruby:spec/controllers/static_pages_controller_spec.rb
describe ‘#home’ do
it “正常なレスポンスを返す” do

元記事を表示

2分探索っぽいものを実装した[Ruby]

## はじめに
競技プログラミングをやっていたら、小さい順に並んだ無数の自然数の配列中(重複は無い)から、与えられたターゲットが配列のどの数とどの数の間にあるのか実装する必要があった。
無作為に0から探していくと実行時間切れになったので、2分探索っぽい実装をして効率的に探索を行おうとした。

## 計算量
配列の全ての要素に対して探索を行う場合には、計算量が配列の要素数に比例して大きくなる。つまりオーダー記法で書くとO(N)

これに対して、二分探索を行うと、計算量はO(logN) (2分探索では対数の底は2)となるので、要素数が増えたときにも計算量の増加は比較的少なく済む。

これなら時間内に実行時間内に探索が終わりそう。

## 実装
とりあえず実装

色々と未熟な点があると思いますので、ご指摘があればコメントいただけるとありがたいです。

“`ruby

array = [1, 4, 6, 8, 20, 34, 87, 118, 234, 769, 1000, 8909] # 自然数の配列(ソート済み)
target = 48 #ターゲットとなる自然数
outputs = “配

元記事を表示

renderが省略されてて眠れなくなったので調査

## はじめに
この記事は[エムスリーキャリア Advent Calendar 2019](https://qiita.com/advent-calendar/2019/m3c) 18日目の記事です。

エニジニアリンググループのおどです。
新卒入社した会社を8月に辞め、エムスリーキャリアに転職しました。
転職を機にLaravelエンジニアからRailsエンジニアに転身。

今回は利用するフレームワークがLaravelからRuby on Railsに変わり、つまずいたところを軽く深堀してみようと思います。

## 何に詰まったのか

入社して最初、簡単な文言修正のタスクからアサインされました。

「お、viewファイル見て文字直すだけとか簡単じゃん」

Laravelで開発をしてたときのようにroutingファイルを見て、controllerにたどり着きました。

“` home_controller.rb
class HomeController < ApplicationController def index end end ``` どのファイルをレンダリングしている

元記事を表示

ruby 学習アウトプット1

###はじめに
ただの初学者のrubyシルバー取得に向けての学習アウトプットです。
文章もただただ、タコ殴りしてるだけなので、温かい目で見守っていただけると幸いです。

###今回の教材
####公式擬似問題集
これは下記リンクからgithubに飛びます。
無料です。全50門解説もついてます。(ありがてぇ〜〜〜〜)
[https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0)

####やってみて

全然だめでした。。。。。
ということで、凹んでられないので詰まった部分を復習していきたいと思います。

####以下復習

* 可変長引数の問題

“`ruby
#下記の実行結果は?
def foo (a, *b)
p a
end
foo(1,2,3,4)
#結果は
1
“`

`*b`は可変長引数で引数を複数個設定できる。引数は配列として受け取られるので今回の場合

“`r

元記事を表示

2020国内開催予定の技術カンファレンスをまとめてみた

## 概要

2020年に国内で開かれるカンファレンスを時系列順にまとめました。

* ジャンルも規模も関係なくまとめています。
* 随時更新中

## 一覧

### 1月

#### [Regional Scrum Gathering Tokyo 2020](https://2020.scrumgatheringtokyo.org/index.html)

日時: 2020/1/8-10
場所: 東京都千代田区 御茶ノ水ソラシティカンファレンスセンター

#### [Awwwards Conference Tokyo](https://conference.awwwards.com/tokyo/)

日時: 2020/1/23-34
場所: 東京都千代田区 イイノホール&カンファレンスセンター

#### [SRE NEXT](https://sre-next.dev/)

日時: 2020/1/25
場所: 東京都千代田区 ヤフー株式会社

#### [NetSci-X 2020 Tokyo](https://netscix2020tokyo.github.io/)

日時:

元記事を表示

Rails のバグ報告テンプレートがすごい!

# この記事は

[ruby-jp](https://ruby-jp.github.io/) の #rails チャンネルで知った Rails のバグ報告テンプレートが目からウロコだった話をします。[bug_report_templates/active_record_gem.rb](https://github.com/rails/rails/blob/v6.0.2/guides/bug_report_templates/active_record_gem.rb) の存在を知らない方向けです。

# 概要

## 気軽に ActiveRecord の動作を確かめたい

ちょっと ActiveRecord の動作を確かめたい。でも手元にちょうといい Rails プロジェクトがない。rails new するのは面倒だ……。マイグレーションも書かなきゃ……。

そんなとき、Rails のリポジトリに含まれている次の Ruby スクリプトが役に立ちます。Rails のバグ報告テンプレートだそうです。

https://github.com/rails/rails/blob/v6.0.2/gu

元記事を表示

RailsのCSRF対策について

# **CSRFとは**
– Cross Site Request Forgeriesの頭文字をとってCSRF(シーサーフと読むらしい)
– Webアプリケーションにおける脆弱性の1種
– ざっくりいうと「サイトのログイン状態が保持されている状態で悪意のあるリンクを踏むと、意図しないリクエストを送ってしまう」というもの
– 以下具体例
– 利用者Aがサイトにログインする
– ログインに成功した時点でRailsアプリはAが使ってるブラウザにセッションクッキーを保存する
– このセッションクッキーはそれ以降すべてのHTTPリクエストと一緒に送信される
– Railsはこのセッションクッキーの値を調べることで、ログイン済みかどうかを判断する
– 攻撃者Xが他のサイトに悪意のあるリンクを仕込む
– ユーザー認証はブラウザに保存されているセッションクッキーで突破することを前提
– 利用者Aが攻撃者Xが仕込んだリンクを踏む
– セッションが切れていなければ、アプリ側はログイン済みだと判断する(他のサイトからのリ

元記事を表示

railsエラー解決

rails sした後に切り忘れない。エラーが出ることがある。

rails sができない時はserver.pid消去する又は
$ ps aux | grep [p]umaをして
kill -9 ####←出てきた番号を入力

同じ名前のファイル名がいくつかあり配置ミスまたは消去していなければ読み込まれずエラーが出る。

ActiveRecord::PendingMigrationErrorが出たら

rake db:migrate
をして再度
rails s

元記事を表示

Rubyでデータをランダムに取得する

## はじめに
ランダムに10個取得したいときの実現方法が色々とあったため、備忘としてまとめました。
おそらく、いくらでもあります

## ランダム取得

Animalモデルから10個取り出す

#### RANDOM()を使用

“`rb

@random = Animal.order(“RANDOM()”).limit(10)
“`

#### RAND()を使用
MySQLはRAND()じゃないと動かないそうです。

“`rb

@random = Animal.order(“RAND()”).limit(10)
“`

#### 配列をshuffle

“`rb
array = Animal.all
@random = array.shuffle[0..9]
“`

#### pluckを使う
idカラムから全て取ってきてシャッフルしてくれます。

“`rb

random_num = Animal.pluck(:id).shuffle[0..9]
@random = Animal.find(random_num)
“`

元記事を表示

RailsのenumをGem無しでi18nに対応させる

# この記事は一体?

Railsでenumの値をi18nに対応させる方法として、よく紹介されるのがGemを入れて対応させる方法です。
例えば [enum_help](https://github.com/zmbacker/enum_help) や、 [enumerize](https://github.com/brainspec/enumerize) がよく取り上げられます。

しかし、enum_helpは(2019/12/17現在)更新が2017年で止まっており、
継続してメンテナンスされてないGemをプロジェクトに入れるのは考えものでしょう。
enumerizeは高機能ではありますが見慣れたenumの書き方ではなくなるし、
やりたいことに対してオーバースペック気味なのでは? と感じます。

そこで、Gemに頼らず自前でenumの値をi18nに対応させてみます。

ここでは以下の2点を実現します。

– モデルのインスタンスからenumのカラムの値を日本語化して取得する
– モデルからenumのカラムで設定可能な値の配列を日本語化して取得する

# 方法

各モデルの親クラスとなる

元記事を表示

each を遅延評価しながら複数プロセスで並行処理

だいたい “[each を遅延評価しながら複数スレッドで並行処理](https://qiita.com/labocho/items/c8316e26aff8ace1baa1)” のプロセス版。

“`ruby
require “thread”
require “thwait”

module MultiProcess
DEFAULT_NUM_OF_WORKERS = 10

module_function
def each(enumerable, num_of_workers: DEFAULT_NUM_OF_WORKERS, &block)
thwait = ThreadsWait.new

enumerable.each do |item|
# 子プロセスの数が上限に達していたら子プロセスの終了を待つ
thwait.next_wait.join if thwait.threads.size >= num_of_workers

# fork して block を実行
cid = fork do

元記事を表示

rubyを再インストール方法

**なぜ、version2.3.1を選んで書いているのかというと、2.3.1がなかなか入らなかったからです。**
`rbenv uninstall 2.3.1`

`rbenv install 2.3.1`

`re gem install bundler`

`rebi`(reb install –path=vendor/bundle –binstubs=vendor/bin)

`rm -rf vendor/` (-rfはコマンド のオプション)

ここまでエラーなくうまく行けば下記のコマンド を実行:sparkles:

`rebem`rebe middleman

**rubyのバージョン切り替えた後、ちゃんと毎回 rebiをする。**

`rebi`は(reb install –path=vendor/bundle –binstubs=vendor/bin)

元記事を表示

Hash#sliceでkeyによるフィルタリング

## やりたかったこと

タイトルの通り、Hashをキーの配列でフィルタリングしたかった

“`ruby:want_to_do.rb
base_hash = {
alpha: “α”,
beta: “β”,
gamma: “γ”
}

filters = %i[alpha gamma]

puts base_hash.somefunction filters # => { alpha: “α”, gamma: “γ” }
“`

## みつけた

“`ruby:found_how_to_do.rb

# filters は * で展開してあげよう
base_hash.slice(*filters) # => { alpha: “α”, gamma: “γ” }
“`

## 結論

`filter`という言葉にとらわれ過ぎて、`Enumerable#filter`ばかり当たってしまった。検索は多角的にやろう。

元記事を表示

【heroku】デプロイの方法、appの削除

・設定箇所
1 Gemfile
2 config/datebase.yml
3  config/environments/production.rb
4  config/routes.rb

1 ・Gemfileのgem ‘sqllite3’を group :development, :test doへ移動

・Gemfileに
  group :production do
  gem ‘pg’, ‘~>0.18.4’
  end  を追加

 ・bundle install –without productionをコンソールで実行する

2 ・config/datebase.ymlのproductionの箇所を
  production:
  <<: *default   adapter: postgresql   encoding: unicode   に変更 3 config/environments/production.rbのconfig.assets.compile = false をtrueに変更 4 rootがあってるか確認 .gitの設定

元記事を表示

Ruby on Railsの基本的なルーティング

#はじめに
Ruby on Rails 2 Advent Calendar 2019の16日目の記事になります!
今回はRailsのルーターの基本的な記述についてまとめてみました。

#railsのルーティングとは
どのURLにアクセスすることで、何を行うか決定するのがルーティングとなります。
Ruby on Railsではroutes.rbにルーティングの設定情報を記述していきます。
routes.rbはアプリ名/config/routes.rbのパスに存在します。

#主な記法
####rootメソッド

トップページ(例えば、「http://localhost:3000/」)を開いたとき,
特定のアクションを呼び出すよう設定ができます。
以下に記述例を書いていきます。

“`
root :to => ‘コントローラ名#アクション名’

#下記ではトップページを開いたときtopコントローラーのindexアクションを呼び出すよう設定しています。
Rails.application.routes.draw do
root :to => ‘top#index’
end
“`

#

元記事を表示

Pay.jp導入手順~登録されたカード情報を使って商品を購入する方法::Ralis~

# はじめに
Payjpを利用してカード情報が登録されていることが前提です
[Payjpカード情報登録](https://qiita.com/hanitan/items/0d7acf619f643f97d413)

### 前提
– Railsでの実装
– deviseの導入が済んでいる
– hamlでの記載(gem ‘haml-rails’)をする
– [Payjpカード情報登録](https://qiita.com/hanitan/items/0d7acf619f643f97d413)ができている

前回の記事の一番下に、成功例と失敗例を記述しています
カード情報が紐づいている状態にしてください

## 全体の流れ
– viewの作成
– controller作成
– ルーティング設定

## 1.viewの作成
viewを作成します。
今回は、フリマアプリのコピーサイトを元に作成します。

“`ruby:view/purchase/index.html.haml
.buy
.buy__header
= link_to root_path do
= ima

元記事を表示

Date.todayとDate.current

開発していて、「どう違うんだっけ…」と考えてしまったので備忘録。

## Date.today
下記によって決まる。
– OSのタイムゾーン(`/etc/localtime`)
– 環境変数`TZ`

## Date.current
`application.rb`のタイムゾーンを使う。

“`
config.time_zone = ‘Tokyo’
“`

DBへの保存時間を変更する場合は

“`
# デフォルトは:utc
config.active_record.default_timezone = :local
“`
## 参考
https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c
https://qiita.com/aosho235/items/a31b895ce46ee5d3b444

元記事を表示

railsのActiveRecordで最新のレコード1件取得する

#はじめに
Ruby on Rails 2 Advent Calendar 2019の17日目の記事になります!
railsで最新レコード1件を取得する方法についての紹介です。(小ネタです。)

##最新のレコード1件取得する
ユーザーテーブルで直近で更新されたレコード1件を取得したい・・・
そんな場合は以下のコードになります。

“`
#モデル名はUser
@user = User.order(updated_at: :desc).limit(1)

#例えば最新登録ユーザーを5名取得したいなどの場合は以下でデータを取得できます。
@user = User.order(created_at: :desc).limit(5)
“`

#まとめ
この記事で誤っている箇所や追記したほうが良い点がありましたらコメント欄などでご指摘いただけますとありがたいです!
普段はSQLを使っているのでActiveRecordになれたいところです。

元記事を表示

OTHERカテゴリの最新記事