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

Rails関連のことを調べてみた2020年02月13日
目次

Rails コーティング規約について 3

# はじめに
Ruby、Railsの基礎を学習中の方に向けて記載致します。
[Rubyのコーティング規約はコチラをクリック願います。](https://qiita.com/raigakun/items/9db169935baa654af90d)
[Railsのコーティング規約 2 はコチラをクリック願います。]
(https://qiita.com/raigakun/items/265046a9fe78debfbd42)
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。

#ActiveRecord Queries
####”sexy” validations を利用する。
利用はしていたが、名称は知りませんでした・・・

“`
# 悪い例
validates_presence_of :name

# 良い例
validates :name, presence: true
“`

#Mailers
####view で email へのリンクを記載する際には、_pathでなく_urlを利用する。
_url が生成するURLはホスト名を含むが

元記事を表示

【rails tutorial 3.4.4】ローカル環境でテストコードを通す方法

railsチュートリアルをローカル環境で開発時に、
ルーティング、コントローラ、ビュー、テストにコードを正しく記述しているにも関わらず、テストが通らずエラーで解決に非常に時間がかかりました。
開発環境はvagrantで、テキストエディタはVScodeを使っています。

#エラー文
テスト実行時のエラーは以下になります。
DEPRECATION WARNING: You didn’t set `secret_key_base`. Read the upgrade documentation to learn more about this new config option. (called from block in at /vagrant/re_learn/test/controllers/static_pages_controller_test.rb:23)
ERROR[“test_should_get_help”, StaticPagesControllerTest, 0.29687339199881535]

元記事を表示

Railsでsvgが扱いにくかったのでsvg_helperというgemを作りました。

## 現状の(Railsでの)svg

現状の`rails`での`svg`の扱いは大きく3つに分けられます。

– `view`から`<%= image_tag %>`で呼び出す方法
– `css`で背景として呼び出す方法
– `view`に`svg`自体をベタ書きする方法

これらの方法の中で`css`の`fill`を使って`svg`の色を変更できるのは**3番目の方法のみ**となっています。

個人的に`svg`は`css`を使って色などを変更できるのが一番のメリットだと考えています。

しかし、現状の`Rails`では`view`にベタ書きする方法でしか`svg`に`css`を適用することができません。

使いにくいです。。。
とても使いにくいです。。。
なので、簡単に`svg`を扱える`gem`を作りました。

## svg_helper(gem)

上で書いた問題を解決できるのが、今回紹介する`svg_helper`です。

使いたい人はご自由にお使いください。

## 導入方法

Gemfileに`svg_helper`, github: `nir-searchright

元記事を表示

postgresで任意のid順にorder by

# 任意のid順にorder by
例えば手元にこのようなidsがあり、このidsの順番でuserを取得したいとき

“`ruby
ids = [2,3,1,10,9]
“`

これでうまくいくかも

“`ruby
users = User.order(“COALESCE(array_position(ARRAY[#{ids.join(“,”)}], id), 0) asc”)
“`

たまにこういうこと並び順が必要になること
ありますよね

元記事を表示

【Rails】flashメッセージをフェードアウトで消す方法【JavaScript】

#はじめに
この記事では、flashメッセージを表示したあと一定時間後にフェードアウトさせる方法を解説します。

flashメッセージ系の記事はたくさんあるのですが、
どれも`bootstrap`を使用してたり
何やら複雑な方法だったり(Hamlハムル??とかrenderとかややこしい!)。。

もっと簡単な記事はないのか!とモヤモヤしたので、自分まとめます。
自分と同じような人の為に!!(自分用のメモですすみませんw)

#flashメッセージの表示方法
それではレッツ実装!!

まずはコントローラーから。
#コントローラー

“`ruby

def destroy
@review = Review.find(params[:id])
@review.destroy
if review.destroy
redirect_to root_path, notice: “︎レビューを削除しました!”
end
end

“`

メッセージを表示させる記述は4行目の`if`文からです。

レビューが削除された後、`root_path`(ホーム画面)に戻

元記事を表示

ローカル環境にて、nokogiriが原因(?)でbundle installできないときの解決策

ローカル環境にrailsの開発環境を作ろうと以下の記事[Ruby初学者のRuby On Rails 環境構築【Mac】](https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07)
を参考に進めていると、以下のエラーに遭遇した。

“`ターミナル
$bundle install

#以下が実行結果

Fetching gem metadata from https://rubygems.org/………….
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies…
Using rake 13.0.1
Using concurrent-ruby 1.1.6
Using i18n 1.8.2
Using minitest 5.14.0
Using thread_safe 0.3.6
Using tzinfo 1.2.6
Using zeitwerk 2.2.2
Using activesupport 6.0.2.1
Using bui

元記事を表示

Railsで検索機能を実装する場合の4つのパターン

## パターン
– Ransackを使う
– コントローラーに書く
– Concernに書く
– Formオブジェクトを使う

## Ransackを使う
Ransack使うとソートも楽に書けそうだけど、
追々カスタマイズが面倒そうなのもあり最初から自分で書くことが多い。
あまり使ったこと無いので、ケースによっては触ってみたい。

## コントローラーに書く
“`ruby
comments = Comment.where(post_id: params[:post_id]) if params[:post_id].present?
“`

こんな感じでコントローラーに直接where文を書くケース。
何も考えずに書くとこうなることが多いと思う。
条件式が増えてくると複雑度上がってrubocopに怒られる。

## Concernに書く
“`ruby
module Comments
module SearchModule
extend ActiveSupport::Concern

def self.do_search(params)
comments

元記事を表示

【Rails】Pinterest APIで自分のアカウントのピン一覧を取得し、JSONを返すサンプルコード

## はじめに
**Pinterest API**を使ってみたので自分用に備忘録を残します。

今回対象とする機能は、**「自分のアカウントのピン一覧を取得する」**です。
[公式ドキュメントはこちら](https://developers.pinterest.com/docs/api/pins/)

※利用制限等についてはご注意下さい。

> (著作権所有者の許可を得ている場合を除いて)画像を保存または改変しないこと、また Pinterest にある画像をユーザーが印刷できるようにしないこと

> ピン以外のデータを保存しないこと

などなど、制限があります。
[デベロッパー向けガイドライン | Pinterest Policy](https://policy.pinterest.com/ja/developer-guidelines)

## 環境
“`yaml
OS: macOS Catalina 10.15.3
Ruby: 2.6.5
Rails: 6.0.2.1
“`
## 前提
– Access Tokenの取得方法
– `rails new`など最低限の下準備

元記事を表示

docker-composeで.envで開発/本番環境を切り替える

## docker-composeで簡単に環境を切り替えたい
webアプリの開発でサーバーやDBを同時に立ち上げるためにdocker-composeを使用していて
テストや動作確認もコンテナ上で起動してやる場合、webアプリを動かすコンテナとして

– 「production環境」 最小限のパッケージとモジュールを入れて余分なキャッシュ等も消し、できるだけイメージサイズを小さくしたもの
– 「development環境」 テスト関連やgit、分析ツール等の開発に必要なものが入ったやや大きいサイズのイメージのもの

のように2種類以上の環境を使い分けたくなりますが、これをどう切り替えたらいいかという話

単純にdocker-compose.ymlを複数作って -f でファイル名を指定するなど色々やり方は考えられますが
doker-compose内で展開できる[環境ファイル](http://docs.docker.jp/compose/env-file.html)の`.env`ファイルを使うのがお薦めです。

## .envをdocker-composeに展開する
.envファイルをd

元記事を表示

Railsの検索まとめ(find、find_by、where、結合)

##find
“`rb
user = User.find(97)
“`

主キー(基本的にid)に対応するレコードを取り出すことができる。
見つからない場合、例外(`ActiveRecord::RecordNotFound`)が発生する。

##find_by
“`rb
user = User.find_by(email: ‘hogehoge@example.com’)
user2 = User.find_by(age: 24, name: ‘Jack’)
“`

与えられた条件に合致するレコードのうち、最初の1件を取り出す。
複数条件で絞り込むこともできる。
見つからない場合`nil`を返す。

##where
“`rb
users = User.where(age: 24) #24才のユーザー
users2 = User.where.not(age: 24) #24才以外のユーザー
users3 = User.where(age: 24).where(region: ‘Asia’) #24才でアジアに住むユーザー
users4 = User.where(age: 24).

元記事を表示

Postgresqlに接続できない時の対処法

##開発環境
– ubuntu(WSL)
– Postgresql

##解決策
サーバを起動させるために下記のコマンドを実行します。

“`
sudo /etc/init.d/postgresql start
“`
##エラー内容
`rails s`したら、以下のようになった。

“`
PG::ConnectionBad (could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”?

“`
`pg_lsclusters`で現状確認。
やっぱり、downしてる。

“`
10 main 5432 down postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.l

元記事を表示

固まったRailsのローカルアプリケーションサーバ(Puma)を強制終了する

Railsを使用して開発していると、Pumaが固まって`Ctrl+C`でもPumaを終了できないことがあります。そんな時は以下のコマンドで解決!

“`
pkill -9 -f ‘puma 4.3’
“`

上記のコマンドを叩いた後、ターミナルにて以下のように表示されていれば強制終了成功です。

“`
Killed: 9
“`

元記事を表示

dependent: :destroy 削除が出来ない

##今回のテーマは、destroyメソッドが機能しない。
という事で、今回陥った点からまずお話致します。

トークルームにてチャットが出来るアプリにて、マイページでトークルームを削除できない。
という問題点でかなり悩まされる事に。

##テーブル
“`
memo_roomsに関連付けられているのは、
usersテーブル
memo_room_postsテーブル
categoriesテーブル
favoritesテーブル
memo_room_commentsテーブルの5つです。
“`

##解決前までの流れ。

最初にルームが削除出来ないと気付いた時には
“` def destroy
@memo_room.destroy
flash[:success] = ‘メモルームを削除しました。’
redirect_to user_path(current_user)
end“`

コントローラにてこんな感じで書いていました。これにより、失敗しても成功しても削除しました。としか出ず、成功はしてるが、
何故か削除出来ていない。こう勘違いしました。どうしても

元記事を表示

自身が sidekiq のプロセスかどうか判定する

# 問題

Rails Server や Rake Task のプロセスで実行するパッチを Sidekiq のプロセスでは実行したくないが Sidekiq では、オフィシャルな場合分け方法を提供していない。

# 解決策

Sidekiq プロセスは起動時に config/sidekiq.yml を読み込み、 Sidekiq.options に格納する。したがって自身が Sidekiq プロセスかどうかを見るには config/sidekiq.yml にしか書かれていない情報がすでに読み込まれているかを確かめればよい。たとえば下のような分岐をする。

“`ruby
if Sidekiq.options[:queues].present?
puts “Sidekiq プロセス”
else
puts “Rails Server プロセスをはじめとした Sidekiq 以外のプロセス”
end
“`

もし config/sidekiq.yml 以外で queues を定義している場合はその限りでない。

元記事を表示

HerokuでUglifier::Error: Unexpected token: operator (>).が出たときの解決策

今回僕がHerokuでデプロイしようと試みようとし立ちはだかった「Uglifier::Error: Unexpected token: operator (>).」のエラについての記事です。

僕がデプロイしたときのバージョン等は以下。

[box class=”box17″]
・rubyのバージョン:2.5.1
・Railsのバージョン:5.2.3[/box]

| | バージョン |
|:—————–|——————:|
| rubyのバージョン | 2.5.1 |
| Railsのバージョン | 5.2.3 |

やったことはただ1つです。

それはconfigのproduction.rbに記述されてある

“`
config.assets.js_compressor = :uglifier
“`

“`
config.assets.js_compressor = Uglifier.

元記事を表示

Rails】An error occurred while installing unf_ext (0.0.7.6), and Bundler cannot continue.【解決策】

AWSでデプロイ作業をしていたら以下のようなエラーが出ました。

“`
An error occurred while installing unf_ext (0.0.7.6), and Bundler cannot continue.
“`

完全に詰んだかと思いましたが、1時間かけて解決することができたので共有しようと思います。

| | |
|:—————–|——————:|
|rubyのバージョン | 2.5.1 |
| Railsのバージョン | 5.2.3|
| bundlerのバージョン | 2.0.2 |

では早速見ていきましょう。

僕は、Pay.jpのgemをbundle installしたかったのですが、An error occurred while installing unf_ext (0.0.7.6), an

元記事を表示

【Rails】deviseユーザーの登録日を表示する【めちゃ簡単】

Deviseのユーザー登録日を表示することに成功しました。めちゃ簡単なので、ぜひ実装してみてください。

| rubyのバージョン | 2.5.1 |
|:—————–|——————:|
| Railsのバージョン | 5.2.3 |

手順は以下のような感じになります。

> ・❶:コントローラーにTime_zoneの記述
・❷:ビューにcreated_atの記述

##手順1:コントローラーにTime_zoneの記述

まずは表示したいビューのコントローラーに以下の記述を行います。

“`
class UsersController < ApplicationController before_action :set_zone 〜〜〜〜省略〜〜〜〜 private def set_zone Time.zone='Tokyo'  end ``` こんな感じで、日本語表記を綺麗なものに変更します。 僕の場合だと、usersコントローラーのmember.html.erbにユーザー登

元記事を表示

#Rails + dotenv-rails / overload env files / not linux or OS or shell or docker container env

dotenv-rails does not prepare smart configuration for overload env ?

i write in

`config/environments/development.rb`

or

`config/application.rb`

( after Rails app configuration )

“`rb
Dotenv.overload(*[
Rails.root.join(“.env.#{Rails.env}.local”),
(Rails.root.join(“.env.local”) unless Rails.env.test?),
Rails.root.join(“.env.#{Rails.env}”),
Rails.root.join(“.env”),
].compact)
“`

see
https://github.com/bkeepers/dotenv/blob/v2.7.5/lib/dotenv/rails.rb#L57

# Original by Github is

元記事を表示

【AWS&Rails】 listen “#{app_path}/tmp/sockets/unicorn.sock”がないみたいなエラー【解決策】

AWSでデプロイしようと試みてたら以下のようなエラー出ました。

“`
listen “#{app_path}/tmp/sockets/unicorn.sock”
“`

Unicorn関係はほんとに嫌いです?

しかし解決できたので共有します!

| rubyのバージョン | Railsのバージョン | bundlerのバージョン |
|:—————–|——————:|:——————:|
|    2.5.1 | 5.2.3    |     2.0.2       |

では早速見ていきましょう

##手順1 本番環境にいく

“`
ec2ユーザー ElasticIP アプリ名 $
“`
まずはここまでいきましょう。

##手順2 ps aux | grep unicornコマンドを叩く

“`
ps aux | grep unicorn
“`
そして1番上の左の数字をkillしてあげてください。

“`
ki

元記事を表示

【Rails】uninitialized constant Message::ImageUploaderエラー【解決策】

Railsでアプリ開発を行なっていたところ

“`
uninitialized constant Message::ImageUploader
“`
こんなエラーが出ました。

| | |
|:—————–|——————:|
| Rubyのバージョン |2.5.1 |
|Railsのバージョン | 5.2.3|

しかし、無事解決することができたので、共有したいと思います。

結論、「rails s」をし直しましょう。

“`
$ rails s
“`

僕は今まで何個もアプリを作ってきたんですが、「uninitialized constant Message::ImageUploaderエラー」はrails sし直すことで解決できています。

見たことないエラーはほんとにヒヤヒヤしますね。。。

元記事を表示

OTHERカテゴリの最新記事