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

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

先輩に絶対に覚えておけと言われたもの

### if関連

Rails における nil?, empty?, blank?, present? の使い分けとBetter Practice
https://qiita.com/aeroastro/items/b58228decb7094af7594

### データの取り出し

find、find_by、whereの違い
https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3

pluckメソッドが便利な件について
https://qiita.com/k-o-u/items/31e4a2f9f5d2a3c7867f

元記事を表示

【Ruby on Rails】Active Recordコールバックについて

# コールバックとは
Railsガイドより
>コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。
>コールバックを利用することで、Active Recordオブジェクトが作成/保存/更新/削除/検証/データベースからの読み込み、などのイベント発生時に常に実行されるコードを書くことができます。

Active Recordのコールバックは、ModelなどのActive Recordオブジェクトが更新されたり削除されたりして状態が変わるときに、その前後でイベントが発生する。
そのイベントで任意の処理を行うことができる。

# コールバックの登録方法
例)会員データが削除された時にログを出力する

“`ruby:app/models/member.rb
class Member < ApplicationRecord 略 after_destroy do Rails.logger.info "Member is deleted: #{self.attributes}" end end ``` # 種類 Active

元記事を表示

jQuery割と理解したから一通り使えるようになるコツまとめ(Rails)

RailsでWEBアプリを作ってます。Ruby on Railsの経験値は9月でちょうど1年くらいです。
なんか割と色々な機能を作れるようになったのでちょっとまとめていきます。
こんな機能はどうやって作るの?みたいなのがあればコメントください。考えます。

# jQueryとは?

公式:[https://jquery.com/:title]

この記事を見ていたら特に必要ないとは思いますが、一応Wikipediaから引用

>jQuery(ジェイクエリー)は、ウェブブラウザ用のJavaScriptコードをより容易に記述できるようにするために設計されたJavaScriptライブラリである。ジョン・レシグが、2006年1月に開催された BarCamp NYC でリリースした。様々な場面で活用されており、JavaScriptライブラリのデファクトスタンダードと呼ぶ者もいる[2]。ロゴの下に表記されているキャッチコピーは「write less, do more」(「少ない記述で、もっと多くのことをする」の意)。
>出典:[https://ja.wikipedia.org/wiki

元記事を表示

Railsアプリでログ情報などの大量のcsvエクスポート(出力)をWEBアプリ上で行う

# 出力データが大量すぎて時間がかかる
クライアントからログ情報を分析したいとのことでログ情報をDBから出力するような機能を作ったが
実際に実運用が始まってからログを出力した結果、1, 2日くらいのログであれば時間はかかるがcsv出力できた。しかし、全期間になると時間がかかりすぎて使い物にならない。というような事態に陥った。実際に試してみると15分たっても出力されず、「確かにこれは使えないなぁ。。。」という状態だったので、直接SQLを叩いてログ出力をするようにした。

### それまでに使っていた方法

[RailsでDBのデータをCSV出力しよう|已むに已まれぬ雑記帳|note](https://note.com/shinryyy/n/nbd2c1d466676)
このような感じでよくあるcsv出力をCSVライブラリを使用して出力していた。(これかな。。
[library csv (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/library/csv.html)

今回、生SQLで

元記事を表示

ドラッグ&ドロップ可能なファイルフォームの作成方法

#### `label`をブロックにして、その中に`file_field`を入れて`padding`で範囲を拡張すれば、ドラッグ&ドロップ可能なファイルフォームできると思って試したら、できた。

“`ruby
<%= f.label :file, style: "background-color: #f1f1f1;border: 1px dotted #000;" do %>
<%= f.file_field :file, class: 'form-control-file', style: 'padding: 100px', accept: 'text/csv' %>
<% end %>
“`

### 上のコードを試した結果

#### 見た目

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118229/6f6c39ac-ef1b-0db1-ebe3-a4e05933abd9.png)

#### ドラッグ&ドロップも可能

![スクリーン

元記事を表示

Draper + create.js.erbでHTMLタグを含むとシンタックスエラー

Rails 5.2.3
ruby 2.6.6

*.js.erb内でHTMLタグを含むデコレーターを描画できなかったため解決方法を書きました。
## 解決方法
create.js.erb内のJQueryではシングルクォーテーションを使う。

“`javascript:create.js.erb
// OK
$(“#tag”).html(‘<%= @model.start_btn %>‘)

// NG
$(“#tag”).html(“<%= @model.start_btn %>“)

“`

## 原因
ダブルクォーテーションがエスケープされない。

以下エラー。
“`Uncaught SyntaxError: missing ) after argument list
at processResponse (rails-ujs.source.js:272)
at rails-ujs.source.js:200
at XMLHttpRequest.xhr.onreadystatechange (rails-ujs.source.js:255)
“`

元記事を表示

もう迷わない!RSpec導入の流れ

#RSpecとは
 Railsにおいて、単体テストコードを記述するときに用いるGemのこと。
##テストコードを記述する直前までの大まかな流れ
1. Gemfileに追記
2. Gemをインストール
3. rspecをインストール
4. テストコードをターミナル上で可視化できるようにする
5. FactoryBotとFakerのGemをGemfileに追記
6. Gemのインストール
7. (テスト用の画像を用意)

###1. Gemfileに追記

gem ‘rspec-rails’と記述する。
必ず、group :development, :test do ~ endのグループ内に

“`Ruby:Gemfile
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console
gem ‘byebug’, platforms: [:mri, :mingw, :x64_

元記事を表示

【Ruby on Rails】Webpackerにselect2導入メモ

## jQuery導入
select2を使う為に、jQueryが必要です。

[jQuery導入方法](https://qiita.com/YutoYasunaga/items/9a7eaa0a4ca898535912)

## select2導入

“`:terminal
yarn add select2
“`

“`javascript:app/javascript/packs/application.js
import ‘select2’
import ‘select2/dist/css/select2.css’

document.addEventListener(‘turbolinks:load’, () => {
$(‘.js-select’).select2({
placeholder: ‘Select an option’,
allowClear: true
})
})
“`

## カスタマイズスタイル
“`:sass
$select2-height: 38px

.select2-container
.select2-selec

元記事を表示

ヘルパーで部分テンプレート(パーシャル)を返す

##ヘルパーで部分テンプレート(パーシャル)を返す方法

if文を使って条件ごとに異なるパーシャルを返したい場合があると思います。

しかし”html.erb”ファイルの中でif文を書くとどうしてもコードが長くなってしまいますよね。
例えばこんな風に、、、

“`erb:sample.html.erb
<% if A == A %>
 <%= render 'follow_button' %>
<% else %>
 <%= render 'unfollow_button' %>
<% end %>
“`

こんな時はヘルパーメソッドに処理をまとめるとスッキリします。⬇︎

“`ruby:users_helper.rb
module UsersHelper

def follow_unfollow_button(user)
if A == A
render ‘follow_button’
else
render ‘unfollow_button’
end
end

end
“`

ビューでhelperメソッドを使うと

元記事を表示

【Ruby on Rails】便利なヘルパーメソッド

# はじめに
ヘルパーメソッドについて、[パーフェクトRuby on Rails 【増補改訂版】](https://gihyo.jp/book/2020/978-4-297-11462-6)を読んで個人的に学んだ内容をまとめます。

# ヘルパーメソッドとは
ビューテンプレートで開発の手助けとなる便利なメソッド。HTML生成を行うものやURL生成するものなどがある。

# パスとURLヘルパーメソッド
ルーティングを表示する際のPrefixの値+`_path`でドメインやポートなどを除いた/から始まるパスを、Prefixの値+`_url`とするとドメインなども含んだ完全なURLを返す。
パスに「:id」といった変動する値がある場合、引数にハッシュ形式で値を指定する。
url_forやlink_to、redirect_toでパスやURLを指定する際に使う。

以下のルーティングの場合、次のようなパスやURLが返る。

**ルーティング**

“`
users GET /users(.:format) users#index
user GE

元記事を表示

【Ruby on Rails】ajaxを使ってタグの追加と削除、(成功・エラー)メッセージの表示を行う。

## 環境
Ruby 2.5.7
Rails 5.2.4

### ライブラリ
jQuery 1.12.4

### 前提
今回はTagテーブルを使って解説していきます。

まずはajaxを使わなくてもタグの追加と削除ができることを事前にご確認ください。

エラーメッセージの日本語化やアソシエーションについては触れませんので必要な方はご自身でお願い致します。

turbolinksは無効にしています。(有効時の動作は確認していません。)

## 手順
タイトルにもある通り、次の手順でajaxを利用してタグの追加・削除・エラーメッセージの表示を実装していきます。

1.tag.rbにバリデーションの設定
2.部分テンプレートの用意(`views/layouts/_error_messages.html.erb`, `views/layouts/_flash_messages.html.erb`, `views/tags/_tag.html.erb`)
3.タグの一覧画面、兼新規作成フォームを作成(views/tags/index.html.erb)
4.アクションごとのjs.erbを用意

元記事を表示

Ubuntuでrails6環境構築時、bundle installで引っ掛かる

##環境構築を終えて、bundle installするときに、色々引っ掛かる
OSはWSL1 Ubuntu(18.04)
こちらを参考に進めていきました。
>[(Ubuntu)Ruby on rails 6.0 環境構築](https://qiita.com/Gushi_maru/items/f3b5cc43e135e678085f)

### nokogiriが通らない
“`
An error occurred while installing nokogiri (1.10.10), and Bundler
cannot continue.
Make sure that `gem install nokogiri -v ‘1.10.10’ –source
‘https://rubygems.org/’` succeeds before bundling.

In Gemfile:
rails was resolved to 6.0.3.3, which depends on
actioncable was resolved to 6.0.3.3, which depe

元記事を表示

Rack::Timeout でパスごとにタイムアウトを指定する

[rack-timeout](https://github.com/sharpstone/rack-timeout) を使用しておりパスごとにタイムアウトの指定を変更するため以前(rails 5.2.3、 rack-timeout 0.5.1 まで)は以下のように指定していました(多少簡略化してあります)。

“`Gemfile:Gemfile
gem ‘rack-timeout’, require: ‘rack/timeout/base’
“`

“`ruby:config/initializers/rack_timeout.rb
module Rack
class DynamicTimeout < Rack::Timeout def call(env) # URL が /admin から始まる場合は 30 秒、それ以外は 10 秒となるように @service_timeout = env['REQUEST_URI'].start_with?('/admin') ? 30 : 10 super(env) end en

元記事を表示

ルーティングのネストによって起きていること

動作環境
Ruby 2.6.5
Rails 6.0.3.2

ルーティングのネストによって何が起きているのかがわかりづらかったので、自分の確認を兼ねて投稿してみました。

##ルーティングのネストをした場合
“`ruby:routes.rb
Rails.application.routes.draw do
resources :hoges do
resources :fugas, only: [:index]
end
end
“`
上記のコードでは、hogesに対してfugasがネストされており、ターミナル上でrails routesを実行すると、以下のようになります。

Prefix ➡︎ hoge_fugas
Verb ➡︎ GET
URI Pattern ➡︎ /hoges/:hoge_id/fugas(.:format)
Controller#Action ➡︎ fugas#index

もちろん、上記以外も表示されますが今回はネストの箇所のみを扱います。
これだけだといまいちわかりづらいので、ルーティングのネストをしていない場合と比較していきます。

##

元記事を表示

Railsコマンドが正常に操作しない時疑うべきはspring

#動機
Railsを用いてテストコードを作成中に以下のコマンドを打つと正常に動作しなくなったので備忘録としてどのように解決したかを記述

“`
$ rails g rspec:request article

Running via Spring preloader in process 15349
Deprecation warning: Expected boolean default value for ‘–orm’; got :active_record (string).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECA

元記事を表示

[Rails]カスタムフォントの設定

# はじめに
アプリ開発でフリーフォントを使用してデザインを変えたのでその使用方法をまとめました。

# 目次
1 フリーフォントの準備
2 フォントの読み込み

# 1 フリーフォントの準備
まず、フリーフォントサイトから自分が使用したいものをダウンロードします。
その後、ダウンロードしたファイル(拡張子ttfまたはotf)をapp/assets/fonts下に配置します。

### 注意事項
フォントはそれぞれ利用条件が異なります。商用可能であっても利用できる範囲に制限があったり、使用時に報告が必要なものもありますので、ご利用の際には必ず配布ページをご確認ください。

# 2 フォントの読み込み
CSSファイルに以下を記述します。

“`css

@font-face {
font-family: “abcdefg”;
src: url(‘/assets/abcdefg.ttf’) format(“truetype”);
font-weight: normal;
font-style: normal;
}
“`

フォントを適用したい箇所にfont-family

元記事を表示

[初学者向け]削除機能の実装方法

## 投稿内容
今回は削除機能の実装方法について投稿します。
以下のようなボタンを押した際に`destroyアクション`を発動させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/684d1694-c57e-4f1b-0148-af58d5e04598.png)

## コントローラーのアクション

“`items_controller.rb
class ItemsController < ApplicationController #省略 def destroy if @item.destroy redirect_to root_path else render :show end end end ``` 解説) destroyアクションが呼ばれたらインスタンス変数`@item`を削除します。無事削除できた場合は`root_path`へ遷移。削除できなかった場合は`showアクション`へ遷移するようハンド

元記事を表示

【Ruby】メソッドジャンプをしたい!

### はじめに

>環境macOS Catalina10.15.5

Rubyで他の人が書いたソースコードを読むときにメソッドの定義場所がすぐわかるようにメソッドジャンプがしたいなと思い、いろいろ試してたどり着いた方法を書き記します

私はテキストエディタはAtomを主に使っていたのですが、RubyのコードをAtomでメソッドジャンプするのは、いろいろ試しましたがうまくいきませんでした、なので

####結論 VSCodeを使うのが簡単

という事になりまりました

###導入手順

####1.こちらでVSCodeをダウンロード
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

####2.日本語化

– メニューバーからviewを選択
– command palette を選択
– configure display languageを選択
– install additional languageを選択
– Japanese Language Pack for Visual Studio Code

元記事を表示

【Rails】ビューファイルは使わず、パラメータIDも存在しない中で、アソシエーションのデータを取得する。【APIモードで使う】

## はじめに
備忘録です。

ここでは、ホーム画面(”/”)で

* `「データ全件」`
* `「1つのデータに関連付けされているデータの総数」`
* `「1つのデータに関連付けされているハッシュのデータ」`

を表示させたいとして、indexアクションにて上記のデータを取得する方法について見ていきます。
例えばQiitaのようなアプリケーションを作成するとするならば、

* `「記事全件」`
* `「1つの記事に関連付けされているコメントの総数」`
* `「1つの記事に関連付けされているタグのハッシュデータ」`

を取得していくようなイメージです。

`全てのデータはハッシュとして取得します。`

## 環境
Ruby: 2.6
Rails: 5.2

## モデルの例(作成の過程は省略)

![スクリーンショット 2020-09-28 23.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606750/27fc22be-fca1-58f4-adbb-a68dc3aa01da.png)

元記事を表示

[rails6.0.0]ウィザード形式でActiveStorageを使用して画像を保存する方法

## 概要
ユーザー登録とプロフィールをさせる時に、ウィザード形式でフォームを作成。
プロフィールに画像を保存したかったが上手くいかなかったため備忘録として記載。
※検索しても同じ状況の方がいなかったので役に立てばと思います。

ウィザード形式とは何か?という方は[こちらを参考にしてください](https://qiita.com/ATORA1992/items/40fc543742a6df5a17c1)

## 内容
##### 開発環境
MacOS Catalina 10.15.6
Rails 6.0.0
Ruby 2.6.5

#### テーブル構成

deviseを使ってユーザー登録をさせようとしています。
userテーブルはnicknameのみ追加。
profileテーブルにはtwitterのリンクなど記載。
profileテーブルにactive_strageで画像を保存したい。

### ウィザード形式を実装
ここらへんの機能の実装に関しては
[こちらの記事](https://qiita.com/Tatsu88/items/7447a669b788b011e96b)がかなり近

元記事を表示

OTHERカテゴリの最新記事