- 1. 【個人開発】今のあなたの感情に合った音楽を提案、私はこんな感情の状況のときに、こんな曲を聴くよ!を共有できるアプリを作りました!
- 2. Fly.ioにRailsアプリをデプロイした時に色々なエラーが出たので解決した
- 3. RailsのCurrentAttributesをより有害にするGemを作ってみた
- 4. シンプルな管理者機能【RubyOnRails】
- 5. Reactで永続性を持たせる方法
- 6. 遷移前のリクエストを使ってリダイレクト
- 7. devise_token_authを使ってGETリクエストをすると/omniauth/sessionsへリダイレクトする
- 8. 構造化データについて
- 9. devise導入していれば使えるauthenticate_user!について
- 10. railsにおけるテーブル修正の流れ
- 11. zipを使った中間テーブルへのレコード追加
- 12. インターン中、不採用になった書き方集
- 13. railsでjson出力するときの小技
- 14. 【Rails】引数は必要な分だけ渡すかまるごと渡すか【リファクタリング】
- 15. 多対多のアソシエーションを設定する
- 16. RSpecで遅いテストをふだんskipして、たまに全部実行する方法
- 17. TerraformでRailsを載せるECS Fargate環境とReactを載せるS3環境を作成する
- 18. Railsにおける配列への代入とリファクタリング
- 19. Railsで効率的に列を捌ける仕組みを考える
- 20. RailsでCSVファイルをインポートする方法改
【個人開発】今のあなたの感情に合った音楽を提案、私はこんな感情の状況のときに、こんな曲を聴くよ!を共有できるアプリを作りました!
![ogp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1457972/600c041f-17cf-466f-7421-45bed4284ecb.png)
▼サービスURL
https://www.your-song.site▼github
https://github.com/Hiro929/your_song## はじめに
早速ですが、みなさん、音楽を聴こうとしたとき、何の曲聴こうかなと悩んだことありませんか?
私の場合、ハマっている曲があれば、それを聴くことが多いですが、そうでない場合は「どうしようかな〜」となることが多いです。
また、悲しい時(落ち込んだ時)など、何聴こうかな〜となることが多いです。
そういった時に、おすすめの曲を提案してくれるものがあればいいなと思いました。また、自分はこの曲に助けられているから聴いてみて!とオススメできて、ユーザーの方が落ち込んでいる方などの助けを少しでもできるようにしたいと思い、本サービスを作りました。## サービス概要
主な機能は、2
Fly.ioにRailsアプリをデプロイした時に色々なエラーが出たので解決した
# 環境
– OS
– エディション Windows 10 Home
– バージョン 21H1
– OS ビルド 19043.2130
– `ruby –version` -> `ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32]`
– `rails –version` -> `Rails 6.1.7`
– `flyctl version` -> `flyctl.exe v0.0.435 windows/amd64 Commit: c5149629 BuildDate: 2022-11-22T16:41:44Z`
# 背景
HerokuのPostgres無料プラン終了に伴い、HerokuにデプロイしていたRailsアプリをFly.ioにデプロイし直しました。
基本的には以下の記事を参考にデプロイしましたが、記事内に出てこないエラーに遭遇したので、どのように解決したかを書いていきます。
[Fly.ioでデプロイする手順(Window) – Qiita](https://qiita.co
RailsのCurrentAttributesをより有害にするGemを作ってみた
## なんでこんなGem作った?
こんにちは!合同会社イービルマーシャンズと合同会社Sampo Development代表のサンポです。
フィンランドから台湾経由で日本に来ました。
(このGemは一切Evil Martiansと関係ありません)CurrentAttributesは有害と言われる時もありますが、より有害にできないか、という想いから今回のGem作りを始めました。
面白そうなので、もっと便利に使えるようにしました。
RubyGemsは[ここ](https://rubygems.org/gems/super_current)で、ソースは[ここ](https://github.com/sampokuokkanen/SuperCurrent)で確認できます。
## CurrentAttributesとは何か?
ActiveSupport::CurrentAttributesはRailsの便利機能の一つです。
グローバルで使える値を設定できるので、値を渡さないといけないことが少なくなります。
そしてリクエストごとに自動的にリセットされるので、データの漏洩も心配なし!(
シンプルな管理者機能【RubyOnRails】
## 目標
__事前に設定した管理者用パスワードを打ち込んだ場合のみ、管理者用メニューを見れるようにする。__## 環境
– Ruby 3.0.4
– Rails 6.1.7## 方針
管理者用ログインボタンから管理者用パスワード入力画面(`admin_session`)に遷移させ、入力した内容を`admin_authentication`に送り、事前に`.env`上に用意しておいたパスワードと一致したときのみ、メニュー画面(`admin_index`)を表示(リダイレクト)させる。一致しない場合は管理者用パスワード入力画面(`admin_session`)を表示(リダイレクト)させる。## 完成形
##### コントローラー(トップページを扱うもの:今回はhello_controller.rb)
“`ruby:hello_controller.rb
#前略def admin_session
enddef admin_authentication
if params[:input_password] == ENV[
Reactで永続性を持たせる方法
今回はログインの時などでReactで永続性を持たせる方法について紹介します。
### Reactで永続性を持たせる方法
結論から言うと、localstorageを使えば大丈夫です。
これ以外の方法もありますが、今回はlocalstorageを使用します。
localstorageでは、ローカルのStorageオブジェクトにアクセスでき、そこに
保存することができます。sessionStorageと違いは、sessionStorageだと保存されたデータはセッションが終わる(ブラウザを閉じる)と同時に消去されることです。
localstorageだと、キャッシュなどを削除しない限りは残るので安心です。
“`javascript
const SignIn: SubmitHandler= (email: any) => {
alert(“ログインしました”);
signInWithEmailAndPassword(auth, email.email, email.password)
.then((userCr
遷移前のリクエストを使ってリダイレクト
# request.referer
遷移元のurlを取得する
“`
request.referer
“`
https://qiita.com/takazi/items/9b1c82d8fcc602df8a1a# これを使って一つ前のページにリダイレクトする
“`rb
redirect_to(request.referer)
“`
成功。# 感想
これでよかったのだろうか?
結果これで自分の中の問題は解決された。
これを参考にできるかは微妙だ。
devise_token_authを使ってGETリクエストをすると/omniauth/sessionsへリダイレクトする
`http://localhost:3000/admin/auth/sessions`へGETリクエストをaxios経由で行うと、意図せず`http://localhost:3000/omniauth/sessions` へリダイレクトしてしまう。
以下がログ。
“`
Started GET “/admin/auth/sessions” for ::1 at 2022-03-04 17:51:33 +0900
Started GET “/omniauth/sessions?namespace_name=admin&resource_class=AdminUser” for ::1 at 2022-03-04 17:51:33 +0900ActionController::RoutingError (No route matches [GET] “/omniauth/sessions”):
“`こんなときはroute.rbを以下の通り変えてあげると解決する。
“`diff_ruby:config/routes.rb
namespace :admin do
mount
構造化データについて
# 構造化データとは
## appleのmacbookについて説明したいけど、、
appleのmacbookの情報をWebページで紹介しようとした時、人間の目ではりんごとmacbookの区別がつきますが、
検索エンジンが理解する言語は人と異なるため、別途説明がないと、りんごに関する情報のWebページだと認識するかもしれません。もちろんmetadata等に明確に情報が明記されていれば、検索エンジンもコンテンツの内容を把握してくれると思いますが、
そうではない場合は意図したように認識してくるない可能性があります。
| ページ名|説明したい内容|
|——-|:———-:|
|appleMacbook.html|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350392/0dc1436f-1dc4-0765-9eba-4e5c25935cf4.png)
|apple.html|![image.png](https://qiita-image-store.s3.ap-n
devise導入していれば使えるauthenticate_user!について
# はじめに
備忘録です。## authenticate_user!とは?
主に2つ理解する必要があります。・deviseのメソッドである
・ユーザがログインしているかどうかを確認し、ログインしていない場合はユーザをログインページにリダイレクトする。## authenticate_user!の使い方の一例
before_action :authenticate_user!, except: [:show, :index]
基本的にはbefore_actionと一緒に使います。上記のコードの意味としては、
全てのアクションの前に、ユーザーがログインしているかどうか確認する。
ただし、showアクションと、indexアクションが呼び出された場合は、除くよ。という意味になります。基本的にindexアクションや、showアクションはログインされていなくてもみられるアプリが多いためです。
(Twitterはログインしていなくても、ツイートの一覧、ツイートの詳細は見ることができる)## 参考記事
https://qiita.com/gogotakatak
railsにおけるテーブル修正の流れ
# はじめに
テーブル設計を誤り、実行する中で間違いに気がついたとき、どのようにテーブルの修正を行えば良いかわからなくなってしまったため、記録に残す。
誤っている解釈があれば、ご指摘お願いします。## テーブルの修正で気にかけること
– マイグレショーンファイルのstatusをup→downへ変更
rails db:migrate:statusでstatus状況を確認→rails db:rollback
– モデルの削除
rails d model モデル名
(マイグレーションファイルも同時に消される)
zipを使った中間テーブルへのレコード追加
コードそのままはやばそうだからテーブル名とかは変えてる。
“`ruby:controller
def create
answer = Answer.new(answer_params)
dates = answer.dates
sc_answers_params.zip(dates) do |status, date|
answer.sc_answers.build(date_id: date.id, status:)
end
if answer.save
render json: [answer, answer.sc_answers]
else
render json: answer.errors
end
end
“`
createメソッドで親テーブルに値を追加すると同時に子テーブルにも値を追加してる。
buildメソッドで作ってるけどnewメソッドでもいける。ただ、子テーブルに関連レコードを作るときは慣習的にbuildメソッドを使用するらしい。
インターン中、不採用になった書き方集
不採用になった書き方を追記していきます。
## ruby
### 複数テーブルの値を一気に引っ張ってくる
“`ruby:不採用
status_count = Event.joins(possible_dates: :schedule_answers).select(“events.*, possible_dates.*, schedule_answers.*”).where(id: @set_event.id).group(:status).size
“`
“`ruby:採用
render json: @set_event.adjust_show_json
“`
別記事で紹介してる小技のやつを使って、メソッドをモデルに実装した。
不採用になったやつは可読性も低いし、めっちゃメソッド使ってるから処理速度的にもきついかも(わからんけど)。
railsでjson出力するときの小技
railsで処理を書いているとき、renderを使用してjsonで処理結果だったりDBのデータを返すことがあると思います。
そんなときに習った小技をメモしておきます。
## 書き方
処理はcontrollerのindexメソッドとかに書くと思います。
でも小技としてはmodelに処理を書きます。
“`ruby:event.rb
def adjust_json
{
event: {
id: self.id,
user_id: self.user_id,
category_id: self.category_id,
name: self.name,
description: self.description,
is_public: self.is_public,
},
dates:
self.dates.map do |date|
{
id: date.id,
at:
【Rails】引数は必要な分だけ渡すかまるごと渡すか【リファクタリング】
## 環境
Rails 6.1.3.1
ruby 2.7.1
mysql Ver 8.0.26## 前提
(1)User -> (多)Attendance
## before
“`create_or_update_time!“`はざっくり言うと
・idがなかったら新規登録
・idと時間の指定があったら特定して更新
・idはあるが時間が指定がなかったら削除
を行うメソッド。この場合、“`create_or_update_time!“`メソッドに引数を必要な分3つのみ(“`parameter[:punch_in]“`と“`parameter[:date]“`と“`parameter[:type]“`)渡している。
引数が3つというのが少し多い気もするが、必要な分の引数を渡す方法で一見良いような気がする。“`ruby
parameter = {
id: employee.id,
punch_in: { id: 1, value: ’11:30′ },
type: ‘home’,
date: ‘2022/10/01’
多対多のアソシエーションを設定する
# はじめに
railsで多対多のアソシエーションを設定する際に必要な知識を忘れないために記録に残します。
なお、テーブル間の関係は、userテーブルとroomテーブルが多対多の関係性であるとする。# アソシエーションの手順
railsにおいて、多対多のアソシエーションを表現するためには、中間テーブルという概念を利用する。
中間テーブルとは、2つのテーブル間に配置するテーブルのこと。– 中間テーブルに紐づくモデルを作成する
% rails g model room_user
– カラムを設定
中間テーブルのマイグレーションファイルに外部キーを記載class CreateRoomUsers < ActiveRecord::Migration[6.0] def change create_table :room_users do |t| t.references :room, null: false, foreign_key: t
RSpecで遅いテストをふだんskipして、たまに全部実行する方法
https://twitter.com/isochikuwa/status/1597044717224886272
上のツイートを見て、どうやるのがいいか考えてみました。
以下がその方法です。遅いテストに`:slow`タグを付けます(名前は`:slow`じゃなくても可)。
“`ruby
it ‘めちゃくちゃ遅いやつ’, :slow do
# …
end
“``.rspec`ファイルに以下の行を追加します。
“`erb:.rspec
<%= '--tag ~slow' unless ENV['ALL_RUN'] %>
“`デフォルトでは`:slow`タグが付いているテストは実行されなくなります。
“`
# :slowタグが付いているもの以外を実行する
$ bundle exec rspec
“`全テストを実行したいときは環境変数`ALL_RUN`を指定します(`ALL_RUN`以外の環境変数名でも可)。
“`
# :slowタグが付いているものも、付いていないものもすべて実行する
$ ALL_RUN=1 bundle exec
“`も
TerraformでRailsを載せるECS Fargate環境とReactを載せるS3環境を作成する
RailsのAPIを載せるステージングと本番用のFargate環境をTerraformで作成する機会があったので自分用のメモも兼ねて記事を書くことにしました。
Reactを載せるためのS3などもTerraformで作っております。
利用しているTerraformのバージョンは1.2.0です。Workspacesを使うかや、Terraform Registryのモジュールを使うかなど悩みましたが、
ひとまず自分の現段階でいいと思えた構成にしています。
ベストプラクティスを示しているわけではないので、より良くなるアドバイスがあれば優しく教えていただけると幸いです。リポジトリはこちらです
https://github.com/hatsu38/rails-nginx-fargate-infra-template## 作る環境
S3とCloudFrontはReactを載せる用のリソースです。
![ECS Fargate For Insight-本番環境.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazo
Railsにおける配列への代入とリファクタリング
# 問題のルール
1. lengthとwidthが引数で渡され、最大サイズの正方形を可能な限り求めて、その正方形の一辺の長さを配列にまとめて戻り値にする。
2. lengthとwidthが同じ長さの場合はnilを返す
イメージ図は下記で、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264678/2d63c005-7786-5382-ac9f-a37d958444a2.png)
テストとしては下記のようなものになる“`ruby
sqInRect(5, 3) should return [3, 2, 1, 1]
sqInRect(3, 5) should return [3, 2, 1, 1]
“`# 最初に書いたコード
ざっと以下のように書いたが、毎度ながら`空の配列list`の定義が少し見にくい時がある。“`ruby
def check_smallest_square(line_a, line_b, list)
## sortの代わりにminm
Railsで効率的に列を捌ける仕組みを考える
# ルール
作業可能レーンに順番にかかる作業時間がバラバラなタスクが流れてきて、最終的に作業可能レーンにタスクがなくなる時間を知りたい## 具体的に
`times`には、作業にかかる時間が適当な数定義されており、
`till`は作業可能レーン数が定義されている。
最終的に全部の`tills`で作業が終わる時間が知りたい。“`ruby
times = [3,4,5,6,7,8,9,20,30]
till = 5
tills = Array.new(till, 0)
# => tills
# => [0, 0, 0, 0, 0]
“`# 求め方
`times`をeachでまわし、`tills`の中で一番作業時間が少ない`列`をindex()の引数に持ち、
その列をtillsから特定して、eachの値を加算していく.“`ruby
times.each {|time| tills[tills.index(tills.min)] += time}tills.max
#> tills
#=> [11, 13, 25, 36, 7]
#> tills.max
#=> 36
RailsでCSVファイルをインポートする方法改
CSVファイルをインポートしてデータベース/テーブルに登録って段取りは結構メジャーで、既に幾つも解説記事が上がってる。その節はお世話になりました。
前はその通りにやって出来たのだけど、今新しいプロジェクトでソースを使い回すと何故か出来ない。確実ではないけど、ひょっとしたらrailsかrubyのバージョンによって出来ないとかあんのか?となったので、今できてるものを以下にメモ的に置いておきます。少なくとも自分はこれで半日潰しました。
バージョンはruby 3.04、rails 6.1.7です。ちゃんとした仕組みとか解説は他を読んだ方がいいよ。
## Gemfile
とりあえず“`Gemfile
gem ‘roo’
“`
bundle installとかもしておくように。## application.rb
一応csvのrequireを書いておく
“`config/application.rb
reuire “rails/all”
require ‘csv’
“`## views
ここが以前と特に違う。
以前は参考にしたサイトはどこも、パスの指定がimpor