- 1. 管理画面
- 2. sorceryを使用して、ユーザー機能を作成しよう
- 3. Active Adminで新規データ作成後に、処理を行わせる方法。
- 4. 【Rails】each文内の要素をjQueryでシャッフル表示させる方法
- 5. Catch allルーティングとActive Storage
- 6. 【Rails】Twitterクローンを作ってみた 〜画像アップロード(ActiveRecord)〜
- 7. 文字列や配列等のオブジェクト内が空かどうか確かめるためのメソッド
- 8. DockerでRailsの開発環境構築するときに、今のところ安定している設定(M1 Mac)
- 9. 【Rails】RspecのFormオブジェクトモデル単体テストコードのエラー
- 10. 【RUBY】if,elseを用いたプログラム
- 11. 【Rails】バリデーションのカスタムコンテキストon:を複数同時に指定したい場合の方法と仕組み
- 12. Rails 【where】日付・時間を範囲指定する際の注意点
- 13. Basic認証
- 14. 【AWS】AMI作成後、502 Bad Gatewayエラーが発生する場合の対処方法
- 15. GoogleスプレッドシートAPIでforbidden: The caller does not have permission (Google::Apis::ClientError)が出た時の対処法
- 16. 【Ruby on Rails】デプロイ手順
- 17. プログラミング言語のバージョンアップ運用を検討してみた
- 18. log_tagsでRails.loggerにsessionのuser_idを出力する
- 19. Bullet Trainを始めよう?️
- 20. 管理者と顧客を分けてDeviseを導入
管理画面
## 参考
https://techtechmedia.com/namespace-scope-module-routing/
sorceryを使用して、ユーザー機能を作成しよう
## 参考
https://linyclar.github.io/rails_memos/libraries/sorcery/
Active Adminで新規データ作成後に、処理を行わせる方法。
## 背景
Active Adminを利用していて、「特定のデータを作った時だけ、通知を送りたい」ニーズが発生しました。
モデル層に、:after_create_commitを置くというやり方もありますが、以下の前提があり、調べてみることにしました。
– 全てのデータ作成時に、通知するのではなくあくまで、ActiveAdmin上からデータを作成した時のみ行いたい。## 方法
以下の方法で達成できます。
ActiveAdminで自動的に設定されているcreateメソッドをオーバーライドし、その後の後続処理を追記するやり方です。
DBに別フローでデータを作成してみましたが、ちゃんとその時は、以下のコードは動かないことを確認しているので、目的を果たすことができました。
“`
ActiveAdmin.register #{モデル名} do
controller do
def create
super do |format|
# ここに処理を入れるだけでOK!
end
end
end
end
“`
【Rails】each文内の要素をjQueryでシャッフル表示させる方法
# 何がしたい?
each文で回した親要素に含まれる子要素の順番をランダムにシャッフルさせて表示させたい。
![shuffle_card.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/cb55a074-723a-8fa8-911d-f729018873ab.jpeg)
# 方法
## viewファイル
“`erb
<% # each文の周回をiとする(iの初期値は0) %>
<% @cards.each_with_index do |card, i| %><% # item_wrapperにRuby構文でインデックスを付与する %><%= card.content_a %><%= card.content_b %Catch allルーティングとActive Storage
Active Storageを使おうとしたら、ルーティングが干渉する事態が発生しました。
## Catch allルーティングとは
Railsのルーティングは`resources`などによるリソースフルなものや、`get ‘path/to/:id’`のようなパス形式の指定が一般的ですが、ワイルドカードを使うこともできます([Rails Guide](https://railsguides.jp/routing.html#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B0%E3%83%AD%E3%83%96%E3%81%A8%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88))。
ルーティングの一部に`*name`と入れると、スラッシュも含んでマッチしうるものがすべて回収されて、アクションの側では`params[:name]`のように取得するこ
【Rails】Twitterクローンを作ってみた 〜画像アップロード(ActiveRecord)〜
## はじめに
[【Rails】Twitterクローンを作ってみた 〜コメント機能の作成〜](https://qiita.com/bloom__fu/items/87287cd705c9bad78524)の続きです。こちらを前提に進めていきますので、まだご覧になっていない方はそちらからご覧ください!※こちらはdockerでの環境構築を省きます。
## サービス環境
– ruby 3.0.0
– Rails 6.0.4
– docker
– mysql 8.0.2
– Slim, SCSS## コメント機能作成
#### 条件
– ユーザー詳細ページの自分のアイコンをクリックでプロフィール画像をアップロードできる。
画像アップロードにはActiveRecordを使用してください。
#### 実装流れ(簡略)
① Gemfileに“`gem “image_processing”, “>= 1.2″“`を追記し、bundle install
② docker再起動
③ “`$ rails active_storage:install“`
④ db:migrate
⑤ models文字列や配列等のオブジェクト内が空かどうか確かめるためのメソッド
# はじめに
文字列や配列を格納している変数の中に、要素が存在しているか確認するケースがあります。
それをまとめたいと思います。## メソッド名とそれぞれの機能
– nil?メソッド
変数の値がnilまたは、値なしの場合、真となります。– empty?メソッド
変数の値が””(文字列の場合)や値が空白の場合、真となります。nil?との違いは、empty?は変数の値はあることはあるが、その値が空を示している、という点です。
– blank?メソッド
nil?が真となる場合、または、empty?が真となる場合に、blank?は真となります。
簡単に言えば、blank?は値といえるものがない場合、真となります。– present?メソッド
blank?とは全く逆の動作をします。present?は、値といえるものがある場合、真となります。DockerでRailsの開発環境構築するときに、今のところ安定している設定(M1 Mac)
最近、RailsのDocker開発環境をチューニングしたので、備忘録です。
# 構成
## 基本
– M1 Mac
– Ruby 3.1.2
– Rails 7.0.4
– Node 16系
– Postgresql## その他
– webpacker(Rails7から引退したみたいなので、そのうち剥がしたい)
– solargraphもdocker
– rubocopもdockerにしたいけどしてない。## 説明
こちらの記事を見て、volume に gem をインストールするよう bundler に設定しました。
https://zenn.dev/aldagram_tech/articles/110bc79925d41bbundle install前に設定
`bundle config set –local path /usr/local/bundle`docker-compose.yml
`bundle:/usr/local/bundle`## ファイル
### Dockerfile
“`dockerfile: Dockerfile
FROM r【Rails】RspecのFormオブジェクトモデル単体テストコードのエラー
# はじめに
rails初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。# 前提
Formオブジェクトクラスを作成して、モデル単体のテストコードの実装を行なっていました。具体的のスクールの課題でメルカリのコピーアプリのようなものを作成していた中で、今回のテストコードの実装がありました。# 概要
商品購入機能を実装し、購入するにあたって、
「クレジットカード情報」
カード情報、有効期限、セキュリティコード
「配送先情報」
“`create_addresses.rb
class CreateAddresses < ActiveRecord::Migration[6.0] def change create_table :addresses do |t| t.string :post_code, null:fals【RUBY】if,elseを用いたプログラム
# はじめに
rails初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。# 指定された2つの真偽値によって処理が異なるプログラムを実装していきます。
平日と休日によって、「その日が遅くまで寝ていられるかどうか」を判断する、sleep_inメソッドとして、真偽値によって処理が異なることを実装します。# 第一引数の値では「平日かどうか」、第二引数の値では「休暇かどうか」をtrueまたはfalseを用いて以下のように表します。
第一引数がtrue(平日である)または、第二引数がtrue(休暇である)の場合はtrueと出力。
第一引数がfalse(平日でない)または、第二引数がtrue(休暇である)の場合はtrueと出力。
第一引数がtrue(平日である)または、第二引数がfalse(休暇でない)の場合はfalseと出力。
第一引数がfalse(平日でない)または、第二引数がf【Rails】バリデーションのカスタムコンテキストon:を複数同時に指定したい場合の方法と仕組み
Railsでは、`on:`を使うことで、バリデーション実行タイミングを指定できたり、カスタムコンテキストとして実行するかしないかを調整できます。
https://railsguides.jp/active_record_validations.html#on
`on:`で定義したカスタムコンテキストを`valid?`等の引数に渡すことでバリデーションのチェックができます。
Railsガイドでは`valid?(:xxx)`の使い方が載っていますが、一度にカスタムコンテキストを複数指定する方法を書いておきたいと思います。## 結論
結論としては、配列で指定してあげれば良いです。
“`ruby:controller
def create
book.valid?([:xxx, :yyy])
…
end
“`“`ruby:book.rb
with_options on: :xxx do
validates :title, presence: true
…略
endwith_options on: :yyy do
validates :contRails 【where】日付・時間を範囲指定する際の注意点
## 行いたいこと
– where句を使用し、モデルのdeadline_onカラムから期日が近いデータを取り出したい。## 完成形のコード
“`
model.where(deadline_on: Date.today..Time.now.end_of_day + (2.days))
“`## 元々書いていたコード
“`
model.where(deadline_on: Time.now.end_of_day + (2.days)..Date.today)
“`
## 沼ったポイント
– 上記の元々書いていたコードでirb上でSQL文を確認していた際、BETWEEN節があったため問題ないと考えていた。
– 実際には、完成形のコードのように日時が早いものを先に後のものを後ろに記載しないと○日~○日までというような範囲指定はされないので注意が必要。Basic認証
# ユーザー認証を導入
## 開発環境で環境変数を設定
※macOSがCatalina以降の場合たとえば
「xxxx」というユーザー名と
「0000」というパスワードにて、設定をする場合。##### ①ターミナルで以下を実行する
“`Terminal:ターミナル
vim ~/.zshrc
“`
すると、「~」が縦に大量に表示される。##### ②「i」を押下し「インサートモード」にする
「– INSERT –」と最下部に表示される。##### ③zshの内部に、以下の記述を追加
“`Terminal:ターミナル
export BASIC_AUTH_USER=’xxxx’
export BASIC_AUTH_PASSWORD=’0000′
~
~
~
~
— INSERT —
“`##### ④インサートモードを終了
「escキー」→ 「:wq」→「Enterキー」を押して終了。##### ⑤sourceコマンドを実行
“`Terminal:ターミナル
source ~/.bash_profile
“`#
【AWS】AMI作成後、502 Bad Gatewayエラーが発生する場合の対処方法
# 概要
ALBの振り分け先WEBサーバを複数用意するため、
– 既存のEC2インスタンスのAMIを作成
– 新規インスタンス起動時に上記で作成したAMIを利用
– ALBのターゲットグループに新しく作成したインスタンスを追加した上でアクセスすると、
> 502 Bad Gatewayのエラーが発生し、アクセスできない状態となった。
# 環境
– アプリ
– ruby 3.0.2
– rails 6.1.4
– mysql 8.0.31– EC2AMI
– Amazon Linux2 AMI
– app server : Unicorn
– web server : Nginx# 原因
– AMI作成時、作成元のEC2インスタンスは再起動される
– サーバの再起動により、Nginxが停止したことで、そもそもアプリが起動しておらず、接続できなくなっていた> 参考
https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/tkv-
GoogleスプレッドシートAPIでforbidden: The caller does not have permission (Google::Apis::ClientError)が出た時の対処法
# どうした?
[こちらの記事](https://qiita.com/kazama1209/items/a08fe0d25384b4a6ea99)を参考に自作のスプシAPIに対してActive Jobを実行したところ、以下のようなエラー文が返ってきました。
“`
forbidden: The caller does not have permission (Google::Apis::ClientError)
“`# 解決方法
エラー文を意訳すると「スプシへのアクセス権が無いよ」とのことなので、スプシの共有設定を変更してあげます。
スプレッドシートの右上にある`共有`ボタンを押し、下図の赤枠の箇所を設定します。![スクリーンショット 2022-11-10 15.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/b364975f-3d34-42a2-19ea-2579027f2426.png)
これにてAPIがスプシにアクセスし、ジョブを実行することができます。
【Ruby on Rails】デプロイ手順
#### Gemを追加
“`Ruby:Gemfile
group :production do
gem ‘pg’
end
“`
“`Terminal:ターミナル
bundle install
“`#### デプロイ用の設定ファイルを追加
① binフォルダに、render-build.shという名称でファイルを新規作成する。
② 作成したファイルに、以下の記述を追加する。
“`Ruby:bin/render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexitbundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
“`
#### database.ymlの設定を変更
このように変更することで、開発環境およびテスト環境ではMySQLが、本番環境ではPostgreSQLが使用されるようになる。
“`Ruby:config/databaプログラミング言語のバージョンアップ運用を検討してみた
## 背景
担当プロジェクトで使用している「Ruby」のバージョンがサポート終了(EOL)となることを受けて、バージョンアップのやっていき方を検討してみたため、記録としてメモを残します。
当初は、「バージョンアップをしなかった場合に起こりえるセキュリティリスク」を全て洗い出して検討しようとしていたが、それはあまりにも壮大な話であったため、リスク対応と対応する工数のバランスについてを検討した。
## 今回の結論
EOLになるからと言ってバージョンアップをするのではなく、CVE(脆弱性情報)として公表されたものの中で対応が必要な場合に対応することとした。
(参考)[cve.mitre.org](https://cve.mitre.org/)
そのような脆弱性情報のほとんどは大きなニュースとして回ってくることが多く、かつ社内の担当部署から情報収集・展開がなされる運用も出来ているため、このような結論に至った。
## 理由
理想でいうと、マイナーバージョンの安定版が出るたびに小まめにバージョンアップをしていくのがセキュリティ面から言うと理想的ではあるが、工数がかかるため、開発
log_tagsでRails.loggerにsessionのuser_idを出力する
## 環境
* Rails 7.0.4
* redis 6.2## cookie_storeの場合
“`rb
# config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, …# config/environments/development.rb
Rails.application.configure doconfig.log_tags = [
:request_id,
lambda { |req|
session_key = (Rails.application.config.session_options || {})[:key]
session = req.cookie_jar.encrypted[session_key] || {}“user_id: #{session[‘user_id’] || ‘-‘}”
}
]
end
“`## redis_stor
Bullet Trainを始めよう?️
## Bullet Trainとは
[Bullet Train](https://github.com/bullet-train-co/bullet_train)とはRuby on Rails上で動くSaaSのフレームワークです([Jumpstart](https://jumpstartrails.com/)みたいなもの)。
つまり、Railsを拡張しているものなので、新規アプリを作った時点で以下の機能がもうすでについています。
1. Deviseを使ってのユーザー登録・認証
2. Sidekiq & Redisのバックエンド・ジョブの設定
3. Jbuilderを使ってのAPI自動生成
4. Webhookの自動生成他にも機能がたくさんありますし、Pro版を買ったらStripeの決済処理の設定など、色んな便利なツールが使えます。
[公式サイト](https://bullettrain.co/)
Bullet Trainの作成者:[Andrew Culver氏](https://twitter.com/andrewculver)
[Discord](https://discord.管理者と顧客を分けてDeviseを導入
## 初めに
今回は管理者と顧客を分けてDeviseを導入していきたいと思います。
※実装前提としてDeviseを導入していること## 管理者と顧客のモデル設定
管理者側がAdmin
“`
管理者用
$ rails g devise Admin
“`
今回顧客側がCustomer
“`
顧客用
$ rails g devise Customer
“`
これをそれぞれターミナルに打ち込みます。## 次にcontrollerを管理者、顧客で作成
“`
管理者用
$ rails g devise:controllers admin
“`
“`
顧客用
$ rails g devise:controllers public
“`
これらをそれぞれ記述するとappのcontrollerの部分がadminとpublicそれぞれ作成され2つに分かれてくれます。## viewページの方も作成
“`
管理者用
$ rails g devise:views admins
“`
“`
顧客用
$ rails g devise:views publics
“`
これ関連する記事
OTHERカテゴリの最新記事
- 2024.09.19
JavaScript関連のことを調べてみた
- 2024.09.19
JAVA関連のことを調べてみた
- 2024.09.19
iOS関連のことを調べてみた
- 2024.09.19
Rails関連のことを調べてみた
- 2024.09.19
Lambda関連のことを調べてみた
- 2024.09.19
Python関連のことを調べてみた