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

Rails関連のことを調べてみた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

元記事を表示

Rails: exifにタイムゾーンがないからどんな感じで保存しようかなと思った話

[Classi Advent Calendar 2019](https://qiita.com/advent-calendar/2019/classi) の18日目、Railsアプリケーションエンジニアをやっている@HokotaMisakiです。

今回書くお話は**Classiではなく、自宅で作っている**野鳥観察記録サービスで体験したものなのですが、マニアックでピンポイントなケースだと思ったので紹介します(テーマ的にRails絡んでるからセーフだと思ってる)。

主に、exifにタイムゾーンの有り無しを確認することになった経緯についての話になります。

※ なおexifとは、画像の中に埋め込まれているメタデータのことです。位置情報や時刻、撮影カメラの設定情報などが保存されています。

# まずは結論から
この2つのあわせ技で行くことにしました。

1. ユーザに**自身のタイムゾーンを登録**してもらう
2. アプリケーションはユーザ毎のタイムゾーンで動き、時刻を**そのままアプリケーションのタイムゾーンで保存**する

#### 「えっ、exifらしさもないし、なんか普通・・・」

元記事を表示

5kg太ったのでイケメンがダイエットを応援してくれるLine bot作ろうとしてた話

[クソアプリ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/kuso-app)がバズってるのを見て、約2年前に作ろうとした**クソ設計☆クソアプリ**を思い出した。。。

## どんなアプリ
イケメン(仮)に「目標体重」と「今日の体重」を教えて、その差分から罵倒されたり褒められたりするLineBot。


(**実際の体重ではございません**)

## 2年前の私
ワイ 「おもちもおせちも美味しい。みかんも食べ放題。幸せだ…」
(久々に体重計乗る)
ワイ 「うわ!5kg太った!!!!!!(泣)」
ワイ 「痩せなきゃ。どうすればいいんだ。イケメンに叱られたら痩せるのに。」
ワイ 「….」
ワイ 「そうか、罵倒してくれるイケメンおらんかったら作

元記事を表示

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

元記事を表示

Rails6 Bootstrap link_toを使ってmethodとclassを両方とも指定しよう

# 目的

– ログアウトボタンを作る時にlink_toを使用して`method`と`class`を指定する際に若干詰まった内容をまとめる

# 結論

– methodとclassを個々に中括弧でくくるのではなく一緒に定義する。

“`erb

“`
# 情報

– header内をBootstrapを使用して書いている。
– 今まで`method`を指定していなかったのでそのままaタグを使用してheaderメニューを書いてた。
– aタグを`link_to`に置き換えたい。

元記事を表示

【初心者向け】Github ActionでのRuby on Rails Deploy

[diffeasyアドベントカレンダー](https://qiita.com/advent-calendar/2019/diffeasy)17日目の記事です。

普段Railsを用いてシステム開発をしています。
私はPM/財務がメインですが、業後の趣味として、日次で弊社自社サービスのKPI値を取得してSlack通知する処理を作りました。

せっかくなので、流行りのGitHub Actionを使いたい!という思いで触ってみました。
鍵設定でハマったポイントがあるのでその点をお伝えしながら、まとめます。

# 設定手順(結論)
まず結論です。以下の手順で設定すればいけます。

– 前提環境
– Ruby on Rails v6.0.1
– Ruby v2.6.3
– capistrano v3.11.2

## 1. Githubに秘密鍵の登録を行う。
Settings > Secrets > Add a new secret
`SSH_PRIVATE_KEY`で登録。BEGINからENDまでを貼り付けします。
—–BEGIN RSA PRIVATE KEY-

元記事を表示

RailsのCSRF対策について

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

元記事を表示

AWS EC2 Railsアプリデプロイへの道

何度やっても抜けが出て何かしらのエラーが出てしまうので、
備忘録のために何をするべきなのかとにかく項目を列挙。わからなかったら項目で調べようの精神です。
対象:個人的ポートフォリオレベルのアプリケーション

# 大まかな流れ
1. インスタンス作成
2. 環境構築(インスタンスの中身を設定)
3. アプリケーションサーバ設定・アプリケーションサーバのみで起動確認
4. webサーバ設定
5. 自動デプロイ(必要であれば)

# インスタンス作成
– [ ] ログイン
– [ ] リージョン選択(2敗)
– [ ] インスタンス作成
– [ ] Elastic IP取得、関連付け
– [ ] ポート解放(1敗 http用)

# 環境構築
– [ ] ssh接続
– [ ] user作成
– [ ] user権限設定
– Node.js導入
– バージョン確認
– [x] gitの導入(入っていなければ)
– [ ] rbenv導入
– [ ] パス設定
– [ ] ruby-build導入
– [ ] rehash(1敗)

元記事を表示

railsエラー解決

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

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

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

ActiveRecord::PendingMigrationErrorが出たら

rake db:migrate
をして再度
rails s

元記事を表示

[Rails] 複数モデルへの同時保存の際にバリデーションを設定する。

# はじめに
Railsのバリーデーションについて、複数のモデルに対して同時保存をする際のバリデーションを設定する際、基礎の理解が甘いまま疎かになってしまっていたので備忘録として残そうと思います。

# バリデーションとは?
はじめに、バリデーションというのは入力された値がちゃんと正しいものなのかチェックすることです。
例えば、カナ入力欄にひらがなや漢字が入力されていたり、電話番号入力欄に20桁くらいの数列が入力されているなど、こういったものが送信、登録されてしまうと不都合ですよね。それを登録するために弾く仕組みがバリデーションです。

# 今回行うこと
複数モデルを同時に登録することのできる簡単なアプリを用意し、バリデーションを設定。エラーメッセージを表示させる。

# 環境
Rails 5.0.7.2
Ruby 2.5.1

# アプリケーションの設計
今回作成したアプリケーションは、一つのツイートが複数の写真を持つことができるようになっています。
[別の記事](https://qiita.com/a2cfry/items/4fa93a426eaf9967461a)でもほぼ同じもの

元記事を表示

Rails EngineでConcernsを使うときのディレクトリ構造に少し戸惑った話

## 戸惑ったこと

下記だとautoloadとしてくれなくて、若干戸惑いました。

“`
engine_app/app/controller|model/engine_app/concerns/
“`

## RailsEngineにおけるConcernsのディレクトリ構造

“`
engine_app/app/controller|model/concerns/engine_app/
“`
controllerかmodelの次にconcerns、engine_appディレクトリがきてengine_app配下のファイルをautoloadしてくれました。

## 参考記事
– [Rails engine concerns autoload paths](https://stackoverflow.com/questions/31052422/rails-engine-concerns-autoload-paths)

元記事を表示

RUNTEQ入学前にやっておいた方が良いこと

RUNTEQのカリキュラムは難しいので`事前にやっておいた方が良い内容`を記載します。
分量が多いですがこの内容をある程度やれると、
RUNTEQの課題で苦しまずに`スムーズに突破`できるかと思います。

## 入学者のレベル

[RUNTEQブログ](https://blog.runteq.jp/runteqnews/2150/)でも紹介されている通り、下記の教材で一通り学習した方が多いです。
・`Railsチュートリアル`
・`現場で使える Ruby on Rails 5速習実践ガイド`(以下、現場Rails)

しかし、いきなりこれら2つに取り組むと挫折してしまう方もいると思うので、
対象者別に`何から始めれば良いか`個人的な意見を記載します。

## 対象者
A. 他のプログラミングスクールなどでRubyやGitでの開発経験がある
B. SIerなどのIT業界でJavaやGitでの開発経験があるが、Rubyの開発経験はない
C. 完全未経験

## 対象者別

#### A. 他のプログラミングスクールなどでRubyやGitでの開発経験がある
Ruby on RailsやGit

元記事を表示

【Docker】Rails圧倒的環境構築&Herokuへ簡単デプロイ

Docker Advent Calendar 2019 の18日目。
どうもてぃです。
僕の好きな数字が **18** で、advent calendarを見たらちょうど空いてたので参戦いたしました。
しょーもない理由です。どうぞ、お手柔らかにおねがいします。

##楽に環境構築したい。。。

弊社では基本バックRails・フロントReactでやっているのですが、毎度環境構築するのにみんな正直愛想を尽かしている次第です。
本番のことはとりあえず置いておいて、ローカル開発環境くらいは一瞬で作ってしまって、さっさとプロジェクトにジョインしたい。
そういった考えの元から、オレオレDockerfile/docker-compose.ymlでRails & PostgreSQL環境を一発で作ってしまおうという結論にいたりました。

人間楽をしたい生き物ですから、 **退屈なことは自動化で瞬殺しましょう**。

##やりたいこと

* Rails new
* bundle ins

元記事を表示

駆け出しエンジニアの効率化備忘録【1秒を節約する】

この記事は、「RUNTEQアドベントカレンダー2019」の記事です。

## 対象読者
プログラミングを学習していて効率化に興味がある人

※ Mac&Rails利用者がペルソナです

## はじめに
この記事では、プログラミング学習して半年ほどの筆者が調べて
「これ、便利だなぁ」と思ったものをまとめます。

一つでも、「あ、これ知らなかったわ、使お」と思ってもらえれば幸いです。

Mac自体の設定から、ショートカットの設定、ツールの紹介などがメインです。

## Mac編
まずはMac編。流石に知ってる人も多いと思いますが、一応。

### ショートカット

自分がまとめるよりこの記事の方が細かくまとめられているので割愛。
[Macで開発するなら抑えておくべきショートカットキーまとめ]
(https://qiita.com/ryuichi1208/items/95b835b63c31d39c7629)

特に、下記のコントロールを使ったショートカットはマジでよく使うので、全て覚えましょう。
(Vimの方が使いやすいという意見が飛んできそうですが。笑)

| コマンド | 概要 |

元記事を表示

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のカラムで設定可能な値の配列を日本語化して取得する

# 方法

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

元記事を表示

【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 多次元配列とかを出力したい

PHPだったら `var_dump` や `var_export` などで配列やobjectの内容を出力してくれるが、Railsだとちょっとわかりにくかったのでメモ。

“`ruby
data = [
{‘id’ => 1, ‘name’ => ‘tom’},
{‘id’ => 2, ‘name’ => ‘ken’},
{‘id’ => 3, ‘name’ => ‘guhi’}
]

data2 = [[
{‘id’ => 1, ‘name’ => ‘tom’},
{‘id’ => 2, ‘name’ => ‘ken’},
{‘id’ => 3, ‘name’ => ‘guhi’}
]]

# putsするとdataもdata2も同じ出力結果になる。ループするときに困った。
puts data
puts data2

# 解決策 to_sをつけてputs
puts data.to_s
puts data2.to_s
“`

これで期待した通り、多次元になっている様子を見れた。
`to_s` は配列でもハッシュでも数字でもなんでも文字列化するよっていうこと。

元記事を表示

OTHERカテゴリの最新記事