Rails関連のことを調べてみた2021年11月07日

Rails関連のことを調べてみた2021年11月07日

APIとは

最近学習しているAPIについて改めて復習したいと思います。

# APIとは

> アプリケーションプログラミングインターフェースの略。
サーバが提供している機能やデータを、httpで通信して利用するための機能の一つ。
データの形式は最近はJSONで返される。

## APIで出来ること

仕様例
・Google Maps API (住所を地図で表示させる)
・楽天商品検索API(キーワードから楽天市場の商品を検索することができる)
・Twitter API(コードを書けば、Twitterを開かずに特定のツイートにリツイーやリプライができる)

## RailsをAPIモードで実行するには

rails newの際に `–api` を入力する。

“`
rails new myapp –api
“`

## APIモードとのファイル差分

ざっくり言うと、ビューファイルやUI関連のgem等が省かれて生成される。

https://qiita.com/61503891/items/d4eda649a10a3494830c

次回はpostmanを使ってログイン認証したいと思いま

元記事を表示

Shopify のデータを BigQuery にエクスポートする方法(Ruby)

## 前提
– Shopify のデータは Bulk Operations で取得する物とします。詳しい方法は[公式ドキュメント](https://shopify.dev/api/usage/bulk-operations/queries)をご覧ください。
– BigQuery へのデータのエクスポートには [google-cloud-bigquery gem](https://github.com/googleapis/google-cloud-ruby/tree/main/google-cloud-bigquery) を使用します。

## 実装

“`:Gem
$ gem install google-cloud-bigquery
“`

“`ruby
require “google/cloud/bigquery”
require ‘open-uri’

# Ref: https://googleapis.dev/ruby/google-cloud-bigquery/v1.37.0/file.AUTHENTICATION.html
Google::Cloud::Bigque

元記事を表示

geochart 日本地図が描画出来ない

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
`slim` で書いている

## 本題

https://developers-dot-devsite-v2-prod.appspot.com/chart/interactive/docs/gallery

上のを参考に日本地図を描画する

ゆくゆくは変数を渡したいけど今回の目標は素の日本地図を描画すること

`js` ファイルを記事を参考にセットアップ。しかし描画されず

コンソールでは

“`
Uncaught ReferenceError: google is not defined
“`

読み込みエラー

___

読み込み位置が悪かった

“`
= javascript_include_tag ‘application’
script src=”https://www.gstatic.com/charts/loader.js”
“`

ってなってたけど正しくは

“`
script src=”https://www.gstatic.com/charts/loa

元記事を表示

Rails でつくる fullcalendar

`fullcalendar` を実装することにした

https://github.com/bokmann/fullcalendar-rails

https://qiita.com/d0ne1s/items/fecd8dca4d34e005ce6d

https://qiita.com/isaatsu0131/items/ad1d0a6130fe4fd339d0

https://qiita.com/syukan3/items/68280ce4ff45aa336363

上の記事参考にさせていただく

結果的にはこんなふう

[![Image from Gyazo](https://i.gyazo.com/add77d3cd4327c69c56850b0166dfb1f.png)](https://gyazo.com/add77d3cd4327c69c56850b0166dfb1f)

神社の参拝した日付と詳細がラベルになっている
それぞれラベルの部分を選択すると詳細にいく

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
日付の入

元記事を表示

railsチュートリアル第11章 editアクションで有効化

###editアクションで有効化
####アカウントを有効化するeditアクション
app/controllers/account_activations_controller.rb

“`rb
class AccountActivationsController < ApplicationController def edit user = User.find_by(email: params[:email]) # paramsハッシュで渡されたメールアドレスに対応するユーザーを認証します if user && !user.activated? && user.authenticated?(:activation, params[:id]) # 攻撃者がユーザーの有効化リンクを後から盗みだしてクリックするだけで、 # 本当のユーザーとしてログインできてしまいます。 user.update_attribute(:activated, true) user.update_attribute(:ac

元記事を表示

railsチュートリアル第11章 アカウントを有効化する

##アカウントを有効化する
今度はAccountActivationsコントローラのeditアクションを書いていきましょう。
AccountActivationsコントローラからUserモデルにコードを移していく作業(リファクタリング)にも取り掛かっていきます。
###authenticated?メソッドの抽象化
“`rb
$ rails console
>> a = [1, 2, 3]
>> a.length
=> 3
>> a.send(:length)
=> 3
>> a.send(“length”)
=> 3
“`
シンボルも文字列もlengthメソッドなので等価になる。

“`rb
>> user.activation_digest
=> “$2a$12$x4xVHmtrDFjVPFFWav31UebLY8r9sdT8ImzSXGSrnqtQBKHyw8Ff.”
>> user.send(:activation_digest)
=> “$2a$12$x4xVHmtrDFjVPFFWav31UebLY8r9sdT8ImzSXGSrnqtQBKHyw8Ff.”
>> use

元記事を表示

railsチュートリアル第11章 ユーザーのcreateアクションを更新

###ユーザーのcreateアクションを更新
####ユーザー登録にアカウント有効化を追加する
app/controllers/users_controller.rb

“`rb
lass UsersController < ApplicationController . . . def create @user = User.new(user_params) if @user.save UserMailer.account_activation(@user).deliver_now flash[:info] = "Please check your email to activate your account." redirect_to root_url else render 'new' end end . . . end ``` ####失敗するテストを一時的にコメントアウトする test/integration/users_signup_test.rb ```rb

元記事を表示

Geocoder seed データの反映でコールバックが発生しない

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
神社テーブルがあり、その住所カラムに `geocoder` をコールバックさせている
`seed_fu` をつかって `seed` データを作成している
説明上関係ないカラムは無視してください

## 本題

神社の `CSV` ファイルの `seed` データを反映する。

そのタイミングで住所カラムにコールバックさせて緯度と経度を登録したかった

モデルには以下のように定義

“`
class Shinto < ApplicationRecord geocoded_by :address after_validation :geocode end ``` `seed` データには以下 ``` import_read('test_shinto.csv') do |line, idx| Shinto.seed do |s| s.id = idx s.name = line[0] s.image = line[1] s.addres

元記事を表示

ransack 検索前と検索後のアクションを1つにする

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
`ransack` を導入している

## 本題

`ransack` を導入するにあたって色々調べた。

どこの記事も検索前の画面と検索後の画面でアクションを分けている。
理由はないんだけど、なんとなくあんまりアクションを増やしたくなかった。

うまいこと1つにできないかなと。
そしたらなんとかできたので。

実際の画面は

[![Image from Gyazo](https://i.gyazo.com/65eccff0969e1dc7f361285b17028caf.png)](https://gyazo.com/65eccff0969e1dc7f361285b17028caf)

こうやって検索したら

[![Image from Gyazo](https://i.gyazo.com/f357bea8dcbddca66ae8d7bd302ea45d.png)](https://gyazo.com/f357bea8dcbddca66ae8d7bd302ea45d)

こうやって同じ

元記事を表示

CSV ファイルを読み込んだら特殊文字がエスケープされた

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
スクレイピングで `seed` データをつくるための `CSV`ファイルを作成してある

## 本題

`CSV`ファイルを `seed` データとしてインポート

内容は
[![Image from Gyazo](https://i.gyazo.com/f01e29bde5d533dd50e6860e25a8e169.png)](https://gyazo.com/f01e29bde5d533dd50e6860e25a8e169)

こんなかんじ。
`View` で表示したとききちんと改行されてほしかったので
`\n` の部分をうまいこと残してスクレイピングしておいた

で、DB に反映させて。
`View` で見てみる

すると

[![Image from Gyazo](https://i.gyazo.com/a44d602584e9a5530c3004fb1d64607a.png)](https://gyazo.com/a44d602584e9a5530c3004fb1d646

元記事を表示

shrine っていう名前のテーブルは作れない

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
管理者画面に `rails_admin` を使っている

## 本題

神社テーブルを作ろうと思って
`shrine` っていう名前で設計した。

実際の開発で `scaffold` で作成して
`rails_admin` の管理者画面で見ると以下のエラー

[![Image from Gyazo](https://i.gyazo.com/82c0ab517a95131a809696c1c1c9921b.png)](https://gyazo.com/82c0ab517a95131a809696c1c1c9921b)

クラス名やテーブル名が不整合おこしてるみたいなので
どっかでタイポしたのかとおもった

なのでブランチを切って再度トライ

しかしまた同じエラー

___

おそらく

https://qiita.com/fuku_tech/items/abbce671e7d882ec2f14

https://github.com/shrinerb/shrine

`shrine` っ

元記事を表示

user モデルが作成されたときに孫モデルまでビルド

以前の続き

https://qiita.com/TatsuyaIsamu/items/a97ae2d911a4e23016d0

ふわっとやりたかったことが形になったので頑張って言語化

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## やりたかったこと

`user` モデルが作成されたときに
`user` モデルに紐づく `ranking` モデルと
その子モデルの `ranking_item` モデルまで `build` する

こうすることで以下みたいになる
[![Image from Gyazo](https://i.gyazo.com/da48ab57b7a0362c9858b42c8e534d2c.png)](https://gyazo.com/da48ab57b7a0362c9858b42c8e534d2c)

テーブルをプロフィールとランキングとで分けることで
ユーザーとしては それぞれを独立した形で変更できる。

さらに神社ランキングにユニークなランキングアイテムをビルドしているので
神社ランキングっていう枠組みの中で神

元記事を表示

devise を使いながら user 作成時に関連モデルをビルドする

`user` モデルを作った
そして `user` モデルに `has_one` の `user_introduction` モデルを作った

自分的には `user` に `user_introduction` をネストさせておいて
作成時にビルドさせる形にしたい。

しかし `devise` をつかっているのでどうしようとなった

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

https://qiita.com/krile136/items/e04181bb9e9dc0f37a79

https://madogiwa0124.hatenablog.com/entry/2017/11/26/221657

このへん参考させていただいた。

どうするのかというと

① `user` と `user_introduction` をネスト
②自分の環境に `devise` のコントローラーをインストール
③ユーザーの新規作成時だけ自分のコントローラーを通るようにルーティング
④ `create` アクションのあとに作成したユーザーに `use

元記事を表示

ルーティング member でネストする場合としない場合

きれいなルーティングで悩んだ

`ranking` テーブルがあって、その `ranking` テーブルの動的な ID を含む
`ranking_item` コントローラーへの URL を作りたかった

`ranking_item` を `member` で囲ってやるといい感じになった。

けどそれだと致命的にだめだったので備忘録

## 開発環境

`ruby 2.6.5`
`Ruby on Rails 5.2.5`

①member でネストしない場合

“`
resources:rankings do
resources :ranking_items
end
“`
生成される URL は

[![Image from Gyazo](https://i.gyazo.com/424abd0f13fb85b1598b4d903e615b70.png)](https://gyazo.com/424abd0f13fb85b1598b4d903e615b70)

まあいいんだけどなんかなあってかんじ
外側の `rankings` のルーティングがいらないんだけどつくられ

元記事を表示

フォロー機能での SystemStackError

フォロー機能
フォローを解除したときに解除できない
なんだ

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

現象は解除した瞬間に
どっとクエリが流れたあとに

“`
Traceback (most recent call last):
2: from (irb):3
1: from (irb):3:in `rescue in irb_binding’
SystemStackError (stack level too deep)
irb(main):004:0> quit
“`

というエラー。無限ループになるとこれがでるらしい

___

`User` モデルと その中間モデルである `Relationship` モデルの両方に

“`
dependent: :destroy
“`

をいれていた。

どうやら両方にいれるとこういうエラーになるらしい
なんとなくふわっと納得

`Relationship` 側の `dependent: :destroy` を削除して解決

元記事を表示

rails で attr_acceccer を見ない理由

http://devtesting.jp/tddbc/?TDDBC%E5%A4%A7%E9%98%AA2.0%2F%E8%AA%B2%E9%A1%8C

上記の自販機演習でがっつりアクセサメソッドについて理解する

そこで1つ疑問がわいた

なぜ自分はこんなにもアクセサメソッドについて知らないのか

ただ冷静に考えて見ると当然なことだった

なぜなら `rails` をつかっていて
アクセサメソッドを使うことなんてなかったから。

ということで `rails` ではどうしてアクセサメソッド使わないでもいけるのかを調べた

___

https://qiita.com/Hassan/items/0e034a1d42b2335936e6

こちらの記事わかりやすくまとめていただいてあった

要するに

“`
class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name t.string :description

元記事を表示

【Rails】Enumを動的に生成する方法

## はじめに
Railsで開発中に、外部からの値を参照して動的にEnumの値(keyとvalue)を生成したいというニッチな情報の備忘録になります。

* RailsのEnumの値を動的にカスタマイズする必要がある人
* Javaのように柔軟にEnumの値を定義したい人

といった人たち向けの記事です。

## 方法

**親クラスの特異メソッドを使用して、定数を参照してEnumを生成しています。**

“`ruby
class EnumFormatter < ActiveRecord::Base SETUP_FRUITS_INFO = { apple: { id: 1, name: "りんご", origin: "青森" }, orange: { id: 2, name: "みかん", origin: "和歌山" }, grape: { id: 3, name: "ぶどう", origin: "山梨" }, }.deep_freeze class << self def fruits_enum enum, validati

元記事を表示

Ruby on Rails 6にTailwindCSSを導入(Gemを使わず)

## Yarnで必要なものをインストールする

“`
yarn add tailwindcss@npm:@tailwindcss/postcss7-compat @tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9
“`

## tailwind.config.jsファイルを生成する

“`
yarn tailwindcss init app/javascript/packs/tailwind.config.js
“`

## postcss.config.jsファイルを編集する

“`javascript:postcss.config.js
module.exports = {
plugins: [
require(‘tailwindcss’)(‘./app/javascript/packs/tailwind.config.js’), // 追加
require(‘autoprefixer’), // 追加

元記事を表示

クラスの理解を深める!

#①.既存クラスの引き継ぎ

Rubyではデータの元となる設計図を作り、その設計図を元に実体となるデータを作るという手順を踏むのでした!

この設計図をクラス、実体となるデータをインスタンスと呼びます!

実はこのクラスは親子関係を作ることができます!

親子関係とは、既存のクラスの情報を元に新しいクラスを作るということです!

これを「クラスの継承」と呼びます!

#②.クラスの継承

クラスの継承とは既存のクラスを元に新しいクラスを作ることです!

このとき、新しいクラスを子クラス(またはサブクラス)、元になったクラスを親クラス(またはスーパークラス)と呼びます!

では、なぜクラスの継承が必要なのでしょうか?

それは、クラスの継承を使えば、共通する部分をまとめることができて効率的だからです!

例えば、パトカー、消防車、救急車のクラスを作成するならば、3つに共通する情報をまとめた自動車クラスを作成し、その自動車クラスを継承したクラスを作成したほうが効率的です!

そうすれば、各クラスは自動車が共通して持つ情報を引き継ぎつつ、それぞれ独自の情報を持つことができます!

このクラス

元記事を表示

acts-as-taggable-onのtag_listでN+1問題が起きる時の対処

## 概要
簡単にタグ機能を実装できる[acts-as-taggable-on](https://github.com/mbleigh/acts-as-taggable-on)というgemがあり、とても便利だが、as_jsonなどのシリアライズするメソッドを使用した際ににN+1問題を引き起こす原因となることがあるのでメモ

## 詳細
この[issue](https://github.com/mbleigh/acts-as-taggable-on/issues/1029)にも書いてあるが

– `acts_as_taggable_on`メソッドは、引数に指定した値に対応する`*_list`という属性と、メソッドを自動的に定義する(例えば:tagsと指定すると、`tag_list`というインスタンスの属性とメソッドが追加される)
– このtag_listメソッドはincludesなどを用いてクエリ回数を減らすことができない(ここの詳細はそこまで深く追ってない)
– [as_jsonは、SomeModel.attributes.keysで返ってくる値それぞれに対して、sendメソッドでメソ

元記事を表示

OTHERカテゴリの最新記事