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

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

ActiveRecordのモデルをキャッシュする時に関連キャッシュを取り除く

# Rails.cacheにmodelをキャッシュする…?
`Rails.cache` などを使い、ActiveRecordのモデルのインスタンスをキャッシュ(==シリアライズして保管)する、ということがある。主にパフォーマンスチューニングのために、DBクエリを減らそう、というような場合。

そのモデルが、`has_many` などの関連(association)を持っている場合、単純にキャッシュにwriteすると、これらの関連のキャッシュが書き込まれてしまう。一件問題なさそうに見えるが、たとえば、関連先のモデルに対して直接アクセスしたりして内容が書き換わる可能性があったりして不都合なこともある。

そういった場合には、モデルをシリアライズ(Ruby的には Marshal.dump) する場合に、この「関連のキャッシュ」を消去してから書いてやる必要がある。

# 結論
キャッシュに書く前に、以下のようにするとよい。

“`ruby
(modelの中で)
@association_cache.clear
Rails.cache.write(…..)
“`
ただし、この

元記事を表示

非同期処理の実装(シンプルバージョン)

### 背景
以下画面から検索を行った時、リストが表示される仕組みについて、非同期処理を実装したい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/76321c9b-59be-8678-aba5-875f0ab057a7.png)

### 環境
Rubyは変更後のバージョンになります。

| 項目 | 内容 |
|:—————–|:——————:|
| OS.Catalina | v10.15.4 |
| Ruby | v2.5.1 |
| Ruby On Rails | v5.2.4.3 |

###

元記事を表示

Payjpを使用したクレジットカード登録機能

#はじめに
某スクールのチーム開発にてpay.jpを活用したクレジットカード登録を担当させて頂きましたのでアウトプットも兼ねてまとめたいです。
ちなみにコードについてはまだまだ素人の為拙い部分も目立つかも知れない為、参考にされる方はご了承ください。

##Payjpとは何か?
クレジットカードを登録、変更、購入を行ってくれる便利なAPIです。
フリマアプリ、ECサイトでクレジットカードを使って商品の購入する時クレジットカード情報が保存されるところになります。
ちなみにカード情報そのものをECサイト上に保存することは禁止されている為ご注意下さい。

現在はWEBサイトに通販も交えたサイトが多く、ネットでのECサービスほぼ全てに実装されている機能で、身分証明も兼ねているため、Webエンジニアになられる方は学んでおいた方が良いかもしれません。

##前提条件
今回のPayjp登録機能実装ですが、前提条件として
・hamlでの記載(gem ‘haml-rails’)
・d

元記事を表示

Docker + Rails5.2 + Unicorn + Nginx + capistranoで自動デプロイ

現在記事作成中です

## Capistranoの導入

### master.keyの配備

“`:EC2ターミナル
ec2-user@ip-17-242-2-2 アプリ名$ mkdir shared
ec2-user@ip-17-242-2-2 アプリ名$ cd shared
ec2-user@ip-17-242-2-2 shared$ mkdir config
ec2-user@ip-17-242-2-2 shared$ exit
“`

“`:ローカルターミナル
#ローカルのmaster.keyをEC2にコピー
$ scp -i ~/myapp.pem ~/myapp/config/master.key myuser@xxx.xxx.xxx.xxx:./myapp/shared/config/
“`

“`:EC2ターミナルで確認
ec2-user@ip-17-242-2-2 ~$ cd myapp/shared/config
ec2-user@ip-17-242-2-2 config$ ls
>master.key
“`

### Gemのインストール

元記事を表示

削除しない掲示板

## 掲示板を作る

誰しもが
一度は作る
掲示板

https://github.com/hanachin/kesenai_tsumi

@sinsoku さんの [NULL嫌いのUPDATEしないDB設計 #DBSekkeiNight / DB design without updating](https://speakerdeck.com/sinsoku/db-design-without-updating) を読んで最近自分も似た感じの設計をしたなあと思い出したので覚えているうちに書く。

## Railsアプリを作る

便利そうなので `–edge` を付けておく

“`console
% rbenv shell 2.7.1
% gem install –pre rails
% rails new –edge –database=postgresql –skip-bundle –skip-webpack-install kesenai_tsumi
% cd kesenai_tsumi
“`

いい感じに `docker-compose.yml`

“`doc

元記事を表示

cancancan で API ベースの制御を行う方法

# 概要
Web システムを構築するにあたり、「ユーザーごとに権限管理を行いたい」という要望は比較的多いと思います。

Ruby on Rails では [cancancan](https://github.com/CanCanCommunity/cancancan) という Gem を使って権限管理を行うことができますが、この Gem は Model への実行権限(read/write)を管理するのが基本的な使い方になっています。

今回、「API の実行権限を管理したい」という要件があり、その方法を調べたのでまとめました。

# cancancan の一般的な使い方(モデルベースの制御)
本題に入る前に、cancancan の一般的な使い方(モデルベースの制御)を簡単に紹介します。
(ほぼ Gem の Readme の日本語訳です)

## Gem のインストール
Gemfile に下記を追加します。

“`
gem ‘cancancan’
“`

## Ability の定義
ユーザーに付与する権限は `Ability` クラスで定義します。
まず、下記コマンドで `Abi

元記事を表示

RUBY_CONFIGURE_OPTSのwith-openssl-dir

opensslを入れた状態で

“`bash:
brew install openssl
“`

RUBY_CONFIGURE_OPTSを設定しておくと

“`bash:
## zshの場合
echo ‘export RUBY_CONFIGURE_OPTS=”–with-openssl-dir=$(brew –prefix openssl)”‘ >> ~/.zshrc

## bashの場合
echo ‘export RUBY_CONFIGURE_OPTS=”–with-openssl-dir=$(brew –prefix openssl)”‘ >> ~/.bash_profile

※実行後にsourceをするかターミナルを再起動しておく
“`

rubyを入れる時にいちいちopensslを入れなくなるので効率的になる。

“`bash:設定した場合
hoge-user ~ % rbenv install 2.7.0
Downloading ruby-2.7.0.tar.bz2…
-> https://cache.ruby-lang.org/pub/ruby/2

元記事を表示

irbでデータを取得したらLIMIT 11される件

普段はpryを使っているので全然気づかなかったのですが、とある時にirbを使うと謎に`limit 11`がついてしまう事象に出会いました。

`LIMIT 11`ってなんやねん!
気になって仕方ないので、雑にぐぐったりしたのですがわからず、、、うーん気になる。
どうしても気になるので調べたところ、`LIMIT 11`がつく理由がわかったので記事にしてみました。

# 事象の確認

このようなモデルがあるとします。

“`ruby
class User < ApplicationRecord has_many :reviews end class Review < ApplicationRecord belongs_to :user end ``` userの持っているreviewsを取得する処理をirbで実行してみます。 ```irb irb(main):006:0> user = User.find 1
User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=

元記事を表示

pluckメソッドとidsメソッドについて

#内容
rails学習中にpluckとibsを使用する機会があったのでまとめる。
#pluckとは?
pluckは、1つのモデルで使用されているテーブルからカラム (1つでも複数でも可) を取得するクエリを送信するのに使用できます。引数としてカラム名のリストを与えると、指定したカラムの値の配列を、対応するデータ型で返します。
*公式ドキュメントより

“`
my_room_ids = current_user.entries.pluck(:room_id)

pryで確認するとこうなる
pry(#)> my_room_ids
=> [7, 8, 9, 10]

“`
上記はcurrent_userに紐付いているentriesのmodelから:room_idの値の配列をmy_room_idsに代入するコードとなる。第2引数を設定すればそれも出力できる。pluckはmapに比べて標準的なデータベースの探索のみなら、約4倍程の速度を出せると言われています。
*注意点
pluckメソッドはクエリを直接トリガするので、その後ろに他のスコープをチェインすること

元記事を表示

ターミナルが動かないだって???

スクリーンショット 2020-06-10 22.28.34.png

環境
Mac OS 10.15.5
AWS cloud9

railsチュートリアルを進めていたら、cloud9のターミナルが突然動かなくなった。
全くコードが書けない。
どうやら、直前に起きた容量オーバーも原因の一つになっているみたいだが、よく調べてみても解決策は出てこない。
どなたかアドバイスいただけないでしょうか?

元記事を表示

三項演算子ではなく||を使ってみる

# はじめに
Rubyで三項演算子を使用した実装をしていましたが、||を使用したほうが短く書け、可読性も高くなると思います。(個人的に)

# ||を使ってみましょう
例えば、xという変数に値aがnilでなければ値aを、nilであれば1を代入したい場合があったとします。
その場合、三項演算子だと以下のような実装ができます。

“`
x = !a.nil? ? a : 1
“`

||を使用すると以下のように実装できます。

“`
x = a || 1
“`
||では、左から順番に評価されるため、評価対象が偽(nilやfalse)であれば右に移り、最初に真だったものを返します。

いかがでしょうか。
好き嫌いはあると思いますが、上記のような場合だと、||を使用したほうすっきりすると思います。

元記事を表示

positionについて

#positionとは
 ざっくり言うと要素の位置を決めるためのものです。要素の上に別の要素を載せる時などに使われます。

#positionと4つのセレクタ
static : 初期値として設定さている。
relative : 現在の位置を基準に相対的な位置を決める
absolute : 親要素を基準位絶対的内地を決める
fixed : 位置を固定する

#positionと4つのプロパティ
top :上からの距離を
bottom :下からの距離
left :左からの距離
right :右からの距離

この4つのセレクタと4つのプロパティを駆使することで要素の位置を決めることができます。

#参考文献

CSSのpositionを総まとめ!absoluteやfixedの使い方は?

元記事を表示

【Rails】reCAPTCHAの導入方法

# 目標

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/2f27b858-bdf8-3d35-8dd9-e61ffbc9228e.gif)

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)
・[ログイン機能実装](https://qiita.com/matsubishi5/items/5bd8fdd45af955cf137d)

# reCAPTCHAを登録

### 1.下記リンクにアクセス

[reCAPTCHA](https://www.google.com/recaptcha/intro/v3.html)

### 2.`Admin cons

元記事を表示

repository指定したgemをbundle install しても最新に更新されない

### TL;DR

gemfileが更新されていない場合gemfile.lockにある`revision`のcommit hashを見に行ってしまうので

“`bash:console
bundle update gem-name
“`
しましょう

### 問題
社内で使っているライブラリに`fork -> PR -> merge`まで行っていざ確認してみようとすると追加したはずのmethodが未定義と言われてしまっていた。

### 解決までしたこと
まず何なら使えるのかを確認

“`ruby:rails_console
# respond_to?はメソッドが存在するかどうかを確認するやつです
GemName respond_to? :configure #-> true
GemName respond_to? :new_added_method #-> false

# PRで入れたはずのメソッドがないことに気づいてgem自体は問題なく入っているかどうかを確認
GemName.added_a_lomng_time_ago_method #-> 通った
“`
ここでPRの

元記事を表示

Railsチュートリアルの走り方を変えてみた: Railsチュートリアル備忘録 – 9章

現在独学でRailsチュートリアル1周目ですが
2周目に挑戦するのであれば
テスト駆動開発(TDD)を試したいと思い
各章のテーマのなかで実装されるべき要件をリストアップしておくことにした

2週目でイメージしているタスクフローとして
要件定義(1週目でここを残す) > テストを書く(2週目のここに繋げる) > 実装
(現実とかけ離れていたらどなたか早めにご指摘ください)

## 目標: より長期間、かつ安全にログイン状態を維持できるようにする

### この章の気付き

– ログイン情報を維持する仕組みにはブラウザに保存されたcookieが使用されている
– Railsの変数が持つ、有効範囲(スコープを)体感できた(ローカル変数とインスタンス変数)
– `assigns(:user)`とすることで直前のインスタンス変数@userにアクセスできるようになる
– 敢えて、コードに例外を発生させる`raise`を含ませることで テストに内包されているかどうか確認できる
– `assert_equal`は`, `で表記する
– Herokuに一時的にアク

元記事を表示

ransackまとめ

#ransackまとめ
検索機能の実装に使われることの多いransackについて自分なりにgithubを読んでまとめてみた。
##ransackとは

>Ransack enables the creation of both simple and advanced search forms for your Ruby on Rails application (demo source code here).

ransackは簡単なフォームや応用的なフォームをRuby on Railsで作ることを可能にします。

まずransackをインストール

“`gemfile
gem ‘ransack’
“`

>1. The default param key for search params is now :q

1.検索パラメータのデフォルトでのパラメータのキーは:qとなっています。

> 2.form_for is now search_form_for

現在はform_forではなくsearch_form_forを用いています。

> 3.you will get yo

元記事を表示

Rails5.2のcredentialsの使い方

皆様こんばんは。
暑いですね。
風が強いですね。
なかなかカリキュラムが進まないですね。

さぁ今回はcredentialsの使い方!!!
rails5.2以上に導入された機能みたいですね。

#1.まずcredentialsとはなんぞや!!

皆様気になってますよね。
credentialsは簡単に言うと

###「チーム開発をしていて、パスワードなどgithubにpushしたくない内容を保管しておいてくれる場所」

(語彙力皆無)

もっと簡単に言うと
###「外部に漏らしたくない値を保管しておく場所」
(これでどうだ!?)

って感じですね。

とりあえずイッテミヨウ!!!!

#2.アクセスの仕方

見てる方「おいおい直接vs codeからいじれるんちゃうんかい!!」

そんなツッコミ大歓迎です。
まず設定がひつようなんですYO!!

#コマンド+pで
bc90bb723ad7d6a1f74c38295bfc0cf3.png2ステップで超簡単!devise導入方法!!(rails5版)

どうもこんにちは!
今回初投稿のこの記事では、deviseを使ってログイン機能の実装方法をお伝えします。
インストールから実際に表示させてログインするまでの流れを解説したいと思います。

#deviseとは
そもそもdeviseとは何でしょうか。
deviseは、ログイン機能やユーザ登録機能などを簡単に実装できるgemのことです。
初期状態では、**emailとパスワード**を設定してログイン、サインアップすることができます。
会員機能を実装したい際にはぜひ使いたいgemですね!

#ステップ1:deviseをインストール
まずはdeviseをインストールしましょう。

Gemfileの一番下に「gem ‘devise’」を書き込みます。

“`Ruby:Gemfile
gem ‘devise’
“`
追加したgemをアプリケーションに読み込ませます。
以下をターミナルで打ち込みましょう。

“`
$ bundle install
“`
そしてdeviseの初期設定を行います。

“`
$ rails g devise:install
“`
以下のような表示になればインス

元記事を表示

カテゴリープルダウン機能の実装

 某プログラミングスクールの最終課題において、カテゴリープルダウン機能(トップページのヘッダーにあるカテゴリーという文字に触れるとプルダウンでカテゴリーが表示される機能)を実装したので、自分のアウトプットのためにも解説していきたいと思います。
スクリーンショット 2020-06-10 10.55.11.png

早速ですが、プルダウン機能実装の流れは以下の通りとなります。
### ① カテゴリーの文字に触れる
### ② jQueryでイベントが発生し、カテゴリーに貼られているリンクを読み取る
### ③ そのリンクでAjax通信を行い、最初は親のカテゴリーをデータベースから取得し、json形式で値を戻す。
### ④ 後は、取得したデータをHTMLの形に組み直して、カテゴリーの文字の下に付け加えるだけです。
#

元記事を表示

Capistrano3 で pg インストールがエラーになる(.bash_profile の PATH が読み込まれていない)

# 結論
1. Capistrano は `.bashrc` しか読み込まない
2. `.bashrc` に `PATH` を書いても エラーになる場合は、`[ -z “$PS1” ] && return` のような記述の上に書かないと読み込まれない

“`:.bashrc
# PostgreSQL12
export PATH=/usr/pgsql-12/bin:$PATH

# If not running interactively, don’t do anything
[ -z “$PS1” ] && return
“`

# 参考

– [【Capistrano】環境変数が読み込まれない!? その場合の対応方法 – とーますメモ ](http://thoames.hatenadiary.jp/entry/2018/07/10/102211)
– [Capistrano3 でリモート側の環境変数設定されてないなって思ったら – びぃえるくぅと。](https://yadex205.hatenablog.jp/entry/2017/07/26/17264

元記事を表示

OTHERカテゴリの最新記事