- 1. Rakeタスクのdescに実行例を書いてちゃんと活用する
- 2. mach-o file, but is an incompatible architecture (have (x86_64), need (arm64e)) の解決策
- 3. railsにActionTextを導入したら、showページで投稿が変になっちゃったので対処
- 4. 【Rails】accepts_nested_attributes_forを使って子モデルも保存
- 5. デプロイをした後の運用方法
- 6. deviseのサインアップ時に名前を登録できるようにする
- 7. [sidekiq schduler]Cron形式での定期処理の書き方
- 8. deviseを用いた「ユーザー管理機能」の実装フロー
- 9. Railsチュートリアルのrails db:seedをinsert_allで速くする
- 10. Herokuの代替先をいくつか試してはみた
- 11. ActiveRecord::StatementInvalid: Mysql2::Error: Specified key was too long; max key length is 767 bytes エラー
- 12. デプロイ後の運用
- 13. 【Docker】mount=type=cacheの使い方【Rails】
- 14. 【Rails】undefined method `posts_path’ for #
- 15. 管理画面
- 16. sorceryを使用して、ユーザー機能を作成しよう
- 17. Active Adminで新規データ作成後に、処理を行わせる方法。
- 18. 【Rails】each文内の要素をjQueryでシャッフル表示させる方法
- 19. Catch allルーティングとActive Storage
- 20. 【Rails】Twitterクローンを作ってみた 〜画像アップロード(ActiveRecord)〜
Rakeタスクのdescに実行例を書いてちゃんと活用する
仕事でRuby on Railsを使っていて、Rakeタスクもよく使っている中で、
実行例もコマンドで確認できるようにした話です。## Rakeタスクとは
Rubyで書かれたコードをタスクとして作成しておき、必要に応じて呼び出し実行できる機能です。https://opiyotan.hatenablog.com/entry/rails-rake-task
## 実行コマンド忘れる問題
Rakeタスクの種類が増えてくると、Rakeコマンドで実行する際に、正しいコマンド名や引数の渡し方などを毎回忘れてしまうという問題が出てきました。
“`ruby
namespace :hoge do
# 実行例: bundle exec rake ‘hoge:fuga[1, 10, 20, 30]’
desc ‘ほげほげする’
task :fuga, %i[hoge_id] => :environment do |_, args|
# 処理
end
end
“`
こんな感じでコード内にコメントで実行例が記述されていたりはしたのですが、毎回Rakeファイルのコードを探すのが
mach-o file, but is an incompatible architecture (have (x86_64), need (arm64e)) の解決策
## 実行環境
– M1 mac
– Rails 7.0.4
– ruby 3.1.0## エラー内容
`rails s`を実行しようとすると次のようなエラーが出てきた。
“`bash
$ rails s
/Users/hoge/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require’: dlopen(/Users/hoge/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/ffi-1.15.5/lib/ffi_c.bundle, 0x0009): tried: ‘/Users/hoge/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/ffi-1.15.5/lib/ffi_c.bundle’ (mach-o file, but is an incompatible archit
railsにActionTextを導入したら、showページで投稿が変になっちゃったので対処
プログラミング学習2か月ちょいのクソ雑魚初心者です。
現在ポートフォリオでActionTextを導入した際に起こったエラーについて忘れないためにメモ書きと同時に、こちらへ初投稿しようと思い立ちました。# 発生した問題
Ruby on Railsで投稿サイトを作っていて、下の画像みたいな感じに投稿画面にActionTextを導入しました。
![222222222222.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885423/6438cce8-4a4e-5d75-fccc-fc89e6f5d2df.jpeg)# で、投稿フォームは問題なかったけど投稿後のshowページが…
試しにテストで投稿します。
![222222222222.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885423/19c7312e-aea3-d702-84a3-a76d45a19134.jpeg)
すると、、、
![333333333
【Rails】accepts_nested_attributes_forを使って子モデルも保存
## まえがき
推奨されてないaccepts_nested_attributes_forを使わずに、親モデルに紐づくレコードの一括保存をしようとしたが結局うまくいかずaccepts_nested_attributes_forを使ったときの備忘録。以下の記事を参考にしましたが、私はうまくいきませんでした。
https://zenn.dev/murakamiiii/articles/5ecefb7a58d1ef
## accepts_nested_attributes_forを使ってみる
親クラスに“`accepts_nested_attributes_for :テーブル名“`を追加“`ruby :event.rb
class Event < ApplicationRecord has_many :possible_dates, dependent: :restrict_with_exception accepts_nested_attributes_for :possible_dates end ``` ```ruby :possible_dates.rb c
デプロイをした後の運用方法
## デプロイの運用方法
今後も使う事があると思うのでメモとして残しておきます。#### EC2へSSHでログインする
“`
username:~/environment $ ssh -i ~/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx
“`@xx.xx.xx.xxはEC2のパブリックIPアドレス
## アプリケーションへ移動
“`
[ec2-user@ip-xx-xx-xx-xx ~]$ cd アプリケーション名
“`
## GitHubからpull
最新のコードをGitHubからpullして持ってくる
“`
[ec2-user@ip-xx-xx-xx-xx アプリケーション名]$git pull origin main
“`## 変更したフォルダーによる運用方法
Gemfileを変更した場合
1. ローカルからリモートリポジトリへpush
2. SSHでEC2へ接続
3. EC2上でアプリケーションへ移動
4. git pullする
5. 以下コマンドを実行
“`
[ec2-user@ip-xx-xx-xx-
deviseのサインアップ時に名前を登録できるようにする
deviseにてログイン機能を実装すると、
サインアップ時に登録できる情報はデフォルトとして 「メールアドレス」「パスワード」が用意される。今回は「メールアドレス」「パスワード」に加えて「名前」を登録できるようにする。
# テーブルにカラムを追加
現状、カラムは「メールアドレス」と「パスワード」のみであるが、ここに「名前」を追加する。
:::note warn
データベースは表形式のテーブルで管理される。
この表形式の行をレコード、列をカラムという。
:::ターミナルにて下記を実行することで、「追加先テーブル」に「追加するカラム」を追加することができる。
“`ruby:ターミナル
% rails g migration Add カラム名 To 追加先テーブル名 追加するカラム名:カラムの型
“`名前を登録できるようにしたいため、「カラム名」を`Nickname`とする。
*「追加先テーブル名」は`User`、カラムの型は`string`とする。“`ruby:ターミナル
% rails g migration AddNicknameToUsers nickn
[sidekiq schduler]Cron形式での定期処理の書き方
## 自分用の書き方メモです。
“`
:schedule:
push_line:
cron: ‘* * 12 * * *’
class: PushLineJob
“`
– 上記のようにconfig/sidekiq.ymlに定期処理をしたいものを書きますが、cronで時間指定をする際の書き方がよくわからなかったのでメモしておきます。## cronを用いた書き方の説明
– cronでは基本的に*を5つ用いて時間を表します。
– 左から、分・時・日・月・年で時間を指定して指定日時になったらシステムを動かすというような形で予約できます。## sidekiqschedulerの場合
– sidekiqschedulerの場合は*が6つあります。
– 最初は何を表しているかわからなかったのですが、公式のGitHubで「一番左は秒だよ」と書いてありました。
– そのため左から、秒・分・時・日・月・年を表しています。## 注意点
– ここまででsidekiqschdulerの時間の指定は大丈夫でしょう。
– 最後に、Railsの時間設定を共通時刻から日本時間に直す
deviseを用いた「ユーザー管理機能」の実装フロー
Gemのひとつである「devise」を使用することで、「ユーザー管理機能」を実装することができる。
# deviseの実装フロー
1. Gemのインストール
2. 設定ファイルを作成
3. モデルを作成
4. テーブルを作成
5. ビューを作成## 1. Gemのインストール
-Gemfileを編集する
“`ruby:gemfile
# 中略
gem ‘devise’
“`
-コマンドを実行
“`ruby:ターミナル
% bundle install
“`
:::note info
Gemfileに追加したいGemの名前やバージョンを記述してbundle installを実行することで、
指定したGemをアプリケーションにインストールができる
:::
-サーバーを再起動
“`ruby:ターミナル
% rails s
“`
:::note warn
下記を変更した際は、ローカルサーバーを再起動する
■Rubyバージョン
■テーブル・カラム情報
■Gemの導入状況
:::## 2.設定ファイルの作成
“`ruby:ターミナル
% rails g insta
Railsチュートリアルのrails db:seedをinsert_allで速くする
## はじめに
[Railsチュートリアル](https://railstutorial.jp/)ではチュートリアルで使用するデータを生成しDBに保存するためにrails db:seedというコマンドを使う。これが自分の古いPC環境ではなかなかの遅さだったので少しでも高速化したかった。
なお、自分の読んだチュートリアルは第4版なので、それ以外の版では事情が違うかもしれない。対象のseeds.rbは[リスト14.14](https://railstutorial.jp/chapters/following_users?version=5.1#code-sample_relationships)。
## 環境
OS: Ubuntu 22.04
Ruby: ruby 3.0.2p107
Rails: Rails 7.0.4
SQLite: SQLite version 3.37.2## 計測
まずはtimeコマンドで現状の計測から始めた。
“`
$ time rails db:seed
rails db:seed 80.90s user 0.78s system 66% cpu
Herokuの代替先をいくつか試してはみた
自分は初心者に毛が生えた程度の知識しかないので一般的な基準ではない前提で見て欲しい。そもそもこの「Herokuの無料期間は終わるので代替先を探してみた!」って記事はさんざん書かれてるだろうから、今更ではある。
結論から書けば、**無料Herokuの代替先は現状存在しない**となる。それも「これ一つ足りない!」ではなく、どれもこれも二つも三つも足りないという印象。当然のことだが、広く使われていたとという意味で「情報量がまったく違う」というのもだいぶ大きい。
以下、とくに断りがなければ全て無料プラン前提の話をする。
# 自分に必要な要件
自分がHerokuで展開していたrailsのwebアプリに必要な要件は次のものがある
1. RailsとPostgresqlが必要
1. cronかスケジューラーとなるものが必要
1. webアプリとは別にスクリプトを回せるWorkerが必要
1. seleniumが動かせる環境が必要
1. 24時間でなくてもいいが、せめて月700時間程度は動かせてほしい単純なアプリではあるのだが、botやスクレイピングなども行うので意外と必要な項目が多いの
ActiveRecord::StatementInvalid: Mysql2::Error: Specified key was too long; max key length is 767 bytes エラー
Railsでアプリ作成時、rails db:migrateのコマンドの後、
Mysql2::Error: Specified key was too long; max key length is 767 bytes
というエラーが出る場合がある。
そんなときは、<変更前>
/config/database.yml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843483/39dd7ce0-237e-6bdb-e8d5-ae21c4c2711b.png)<変更後>
/config/database.yml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843483/6cd813bf-b8be-2a34-2db4-fed58ce4031a.png)上記のように、databaseのencodingのところを修正することで、エラー解決ができる可能性がある。
デプロイ後の運用
### デプロイ後の流れ
デプロイ後に開発環境で行なった変更を、デプロイしたアプリケーションに取り込む方法がいつもわからなくなるため、メモ代わりにまとめました。#### ❶EC2へSSHでログインする
“`
username:~/environment $ ssh -i ~/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx
“`
:::note info
@xx.xx.xx.xxはEC2のパブリックIPアドレス
:::#### ❷アプリケーションへ移動
“`
[ec2-user@ip-xx-xx-xx-xx ~]$ cd アプリケーション名
“`
#### ❸ GitHubからpull
最新のコードを取り込むためにGitHubからpullします。
“`
[ec2-user@ip-xx-xx-xx-xx アプリケーション名]$git pull origin main
“`#### ❹変更したフォルダーによる運用方法
Gemfileを変更した場合
—————————
1. ローカルからリモート
【Docker】mount=type=cacheの使い方【Rails】
## Dockerfile
Rails環境用のDockerfileで`$GEM_HOME`に`–mount=type=cache`を設定するには以下のようにします。
“`Dockerfile
…WORKDIR /home/${USER_NAME}/${PROJECT_NAME}
COPY –chown=${USER_NAME} Gemfile* /home/${USER_NAME}/${PROJECT_NAME}/
RUN –mount=type=cache,uid=1000,target=/home/${USER_NAME}/.cache/bundle <<-EOF set -e GEM_HOME=/home/${USER_NAME}/.cache/bundle bundle install cp -aRT /home/${USER_NAME}/.cache/bundle ${GEM_HOME} EOF ... ``` 一度`~/.cache/bundle`にインストールしてから`$GEM_HOME`にコピーします。 * `GEM_HOME=/
【Rails】undefined method `posts_path’ for #
# 状況
以下のようにresourcesメソッドを使って、usersの中にpostsをネストするようなルーティングを書いた。
“`ruby:config/routes
Rails.application.routes.draw do
root ‘home#show’
resources :users, only: [:show] do
resources :posts, only: [:index, :new, :create, :destroy]
end
end
“`
postsコントローラーは以下のように書いた。
“`ruby:controllers/posts_controller.rb
class PostsController < ApplicationController before_action :authenticate_user!, only: [:new, :create, :destroy] def index @user = User.find(params[:user_id]) @posts = @user
管理画面
## 参考
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関連する記事
OTHERカテゴリの最新記事
- 2024.09.19
iOS関連のことを調べてみた
- 2024.09.19
JavaScript関連のことを調べてみた
- 2024.09.19
JAVA関連のことを調べてみた
- 2024.09.19
Rails関連のことを調べてみた
- 2024.09.19
Lambda関連のことを調べてみた
- 2024.09.19
Python関連のことを調べてみた