- 0.1. 開発環境
- 0.2. ターミナルでの作業手順
- 0.3. belongs_toとhas_many
- 0.3.1. 「完全に理解した」状態の僕が「チョットワカル…」になるまでのとある企業の新人研修 part.2
- 0.3.2. 別コントローラーからビューを呼び出す
- 0.3.3. [Rails] undefined method `has_many’ for main:Objectと出てきた時
- 0.3.4. 「Rails パフォーマンスチューニング」viewファイルで起こるN + 1問題の修正方法
- 0.3.5. FakerBotがActiveHashのバリデーションにかかってしまう問題の解決法
- 0.3.6. 動的にフォームを追加、削除する
- 0.3.7. 動的に表示したDOMに対してjQueryでfocus()する方法
- 1. 解決した方法:
- 2. ちなみに:
【Rails】deviseでログイン機能を作る
# はじめに
課題で読んだ本の感想を投稿するアプリケーションを作りましたが、色々と苦戦しましたので備忘録として記事を投稿しようと思います。
今回はdeviseを使ったユーザーの新規登録・ログイン・ログアウト機能の実装について記載します。# 環境
– 開発 (cloud9)
– 言語 (Ruby 2.6.3)
– フレームワーク(Rails 6.1.6)# 前提
– deviseを導入している
※導入方法については[【Rails】deviceの導入](https://qiita.com/va6Gjz/items/5b3c3fc673777ebf3332)でまとめていますので、参考にしていただけたらと思います。# モデルを作成する
ユーザー機能を作成する際はテーブルなど色々作る必要がありますが、deviceはモデルの作成すると自動的に必要なデータを作成してくれます。まずはモデルを作成しましょう。※このコマンドはdevice独自のものになります。
“`:terminal
$ rails g devise モデル名
“`
今回は「User」という名前のモデルを作成します。
【Rails】rescue_fromによる例外処理
## はじめに
rescue_fromについて軽く調査したので記録する。この記事がだれかの役に立てば幸いです。
## 結論
raiseで発生させた例外を`rescue_from`で検知し、指定したメソッドの実行に繋げることができる。
### 詳細
大まかな使い方は以下の通りになります。
“`app/controllers/application_controller.rb
# Forbiddenの例外を捕捉した場合に、rescue_403メソッドを実行する
rescue_from Forbidden, with: :rescue_403private
def rescue403(e)
render status: :forbidden, json: { message: “アクセス権限がありません” }
end
“`Forbiddenの例外を発生さえる流れとしては、
“`app/controllers/application_controller.rb
# 管理者のみに実行権限を与える
def allowed_to_admin_user!
RailsでTerser利用時にconsole.logを消したい
アセットパイプラインで、JavaScriptの圧縮にTerserを利用するとき、次のように設定しているケースが多いかと思います。
“`ruby:config/environments/production.rb
config.assets.js_compressor = :terser
“`
通常、この設定で問題はないのですが、
**本番リリース時は、console.logも合わせて消したい!** となると、非常に残念なお知らせとなります。
この設定ですと、JavaScriptに書かれた”コメント”は消えるのですが、console.logはそのままソースコードに残ってしまうためです。そこで、Terserにオプションを渡してあげて、挙動を調整していきます。
# console.logを消すための設定
JavaScript圧縮時、console.logを含む「console.*」系も全て消したい場合“`ruby
config.assets.js_compressor = Terser.new(compress: { drop_console: true })
“`一
【Rails】deviseの導入
# はじめに
課題で読んだ本の感想を投稿するアプリケーションを作りましたが、色々と苦戦しましたので備忘録として記事を投稿しようと思います。
今回はdeviseの導入についてを記載します。# 環境
– 開発 (cloud9)
– 言語 (Ruby 2.6.3)
– フレームワーク(Rails 6.1.6)# deviseとは
簡単に認証機能を実装できるgemの一つです。
サインアップ機能やログイン機能が簡単に作れます。# Gemを導入する
まず、Gemの導入します。
Gemの導入の流れは以下のようになります。
– GemfileにインストールしたいGemを記載
– Gemをインストールする#### Gemfileにdeviseを記載する
Gemfileに、以下のようにコードを記載します。
コードの記載場所は最後の行に追加すると良いみたいです。
“`:Gemfile
gem ‘devise’
“`#### Gemをインストールする
コードが追加できたらGemをインストールします。
インストールするためのコマンドは「bundle install」になります。
※bu
Rubyバージョンが切り替わらない? rbenvがバージョンを決める順番について
## はじめに
最近、rbenvでどうしてもrubyのglobalバージョンがうまく切り替わらなくて、困っていました。
色々検索して、複数の記事を参照して設定変更したりしたけど、解決できていません..
そして、stack overflow経由して、rbenvのドキュメントにたどり着き、解決できました。
rbenvがどうやってrubyバージョンを決めるのか、についてもようやく理解できたので、メモとして記録しておきます。## rbenvでRubyのバージョンを確定する順番
[rbenvドキュメント Choosing the Ruby Version](https://github.com/rbenv/rbenv#choosing-the-ruby-version)によると、
rbenvが利用するrubyバージョンを確定する順番は、
1. RBENV_VERSION環境変数を確認する。もし指定があれば、そのバージョンにする。RBENV_VERSION環境変数は`export RBENV_VERSION= x.x.x`コマンドラインで切り替えられる。(`set by`部分は`RBENV_
Railsでエンドポイントを立てるときに沼った話
railsをエンドポイントを作成をしていて沼ったところと、どうやってそれを解決したのかを残しておきます
沼ったポイントとしては**railsのcorsの設定**です## railsのcorsの設定
### どこで沼ったのか
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS)において、Rails APIでは[rack-cors](https://github.com/cyu/rack-cors)というgemを使用していました。
CORSについての詳しい知識はありませんでしたが、
– 許可をしたいAPIを叩く側のドメイン
– 許可をしたいリソースファイル
– 許可をしたいHTTPヘッダー
– 許可をしたいHTTPメソッド
を設定する必要があるということは認識していました。便利なgemに感謝しつつフロントエンドの実装を進めていたところ、ログイン用のAPIを叩いたときにsession idがcookieに保管されていないことに気がつきました。
### どうすれば良かったのか
こちらの[記事](https://nishinatoshiha
belongs_to,とhas_manyを使ったDBへの参照先指定
こんにちは。
modelはDBの情報を動かすために、DBに格納されている情報を引き出してくる役割がありますが、今回は、アソシエーションの1:Nの関係を紐づけるときに使われる
has_manyとbelongs_toについてざっくりと掘り下げてみることにしました。開発環境
- Cloud9
- Rails 6.1.4
ターミナルでの作業手順
1.rails g model コマンドでマイグレーションファイルの作成
→マイグレーションファイルのテーブル内容を編集
(この時点でテーブルはまだ作成されていない)2.rails db:migrate
→マイグレーションファイルからテーブルを作成belongs_toとhas_many
例として、booksテーブルとUsersテーブルに格納されているデータがあります。
“`Schema.rb
create_table “books”, force: :cascade do |t|
t.string “
「完全に理解した」状態の僕が「チョットワカル…」になるまでのとある企業の新人研修 part.2
▼前半こちらから▼
https://qiita.com/kobayashimakoto/items/4fe942815c7fc941821f
今回は前回に引き続いて、どのような流れでアプリを作ったのかをご紹介します。
# はじめに
会社員の皆さん**他部署の人の「名前」や「趣味」をいくつ言えますか?**
「みんなの趣味くらい余裕で知ってるわ」と言えるように
**お手伝い**をするアプリを作ったのでご紹介します。## アプリ概要 〜TeaTime〜
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/6d6f9ffa-87bf-e825-e585-ba3d1e7955d9.png)
**TeaTime(茶会)とは**
**広く、お茶などを飲みながら話を交わすのを楽しむ集まり。**
※ 精選版 日本国語大辞典「茶会」の解説## 簡単な使い方説明
・TeaTimeに登録するだけ。以上!
![image.png](https://qiita-image-store.s
別コントローラーからビューを呼び出す
## はじめに
学習中の初心者です。
言葉足らずなところや間違えがあればコメントにて添削していただけるととても嬉しいです。## 結論
別のファイルからビューを呼び出す際、**renderメソッド**を利用します。
renderメソッドとは、部分テンプレートを呼び出す際に利用するメソッドのことで、
部分テンプレートとは、ビューファイルで繰り返し使用するコードを切り出し、再利用する仕組みのことです。**partialオプション**を付け、呼び出したいファイル名を指定する事で、部分テンプレートを表示することができます。
“`ruby:qiita.rb
【例】
<%= render partial: "ディレクトリ名/呼び出すファイル名" %>
“`## 手順
呼び出されるテンプレートのファイルを作成します。
ファイル名は最初に **_(アンダースコア)** を入れること。“`ruby:qiita.rb
【例】
_sample.html.erb
“`該当するビューファイルにrenderで部分テンプレートを記述。
“`ruby:qiita.rb
<%= rend
[Rails] undefined method `has_many’ for main:Objectと出てきた時
### はじめに
DM機能を実装中に
`undefined method ‘has_many’ for main:Object`
という見たことがなかったエラーに遭遇したので記事にしました。### 結論
今回の場合は`has_many`のせいではなく`room.rb(Roomモデル)`の一行目の記述が何故か消えてしまった事によるものでした。
“`ruby:room.rb
class Room < #この部分が消えていた! has_many :users, through: :user_rooms has_many :chats, dependent: :destroy has_many :user_rooms, dependent: :destroy end ``` 正しくは ```ruby:room.rb class Room < ApplicationRecord has_many :users, through: :user_rooms has_many :chats, dependent: :destroy has_many :user_rooms
「Rails パフォーマンスチューニング」viewファイルで起こるN + 1問題の修正方法
controller側ではなく、viewのeachでN + 1が発生していたので修正しました。
Ruby:3.1
Rails:7.0.2.3
MySQL:8.0## 仕様
– userはcompanyをお気に入り(favorite)登録することができる
– favoriteは中間テーブル
– companyに紐づくfavoriteの中に、ログイン中のuser.idと同じものがあればCSSのclassを追加上記の仕様を、この様に書いていた。
“`ruby:companies_controller.rb
class CompaniesController < ApplicationController def index @companies = Company.all.includes(:addresses).page params[:page] end end ``` ```erb:index.html.erb <% @companies.each do |company| %>
<% if company.favor
FakerBotがActiveHashのバリデーションにかかってしまう問題の解決法
FakerBotを使ってActiveHashを含んだテストコードを作成しようとした際、問題が発生してしまったので、その問題と解決法を書いていきます。
## 問題点:FactoryBotがバリデーションにかかるidを選択してしまい、テストに失敗する
“`ruby
class Prefecture < ActiveHash::Base self.data = [ { id: 1, name: '---' }, { id: 2, name: '北海道' }, { id: 3, name: '青森県' }, ``` ```ruby class Item < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions validates :prefecture_id, numericality: { other_than: 1 } ``` 選択肢の'---'に該当するprefecture_id: 1を選択すると、バリデーションにかかるように設定してあります。 ```ru
動的にフォームを追加、削除する
# 追加した分もDBに保存したい
初投稿です。
フォームを追加、削除する記事はいくつかあったのですが、
DBに保存できるようにする記事は見つけられなかったので備忘録として投稿します。初学者なのでアラが目立つコードだと思いますが、どなたかの役に立てば幸いです。
間違えや、添削があればコメントにて教えていただければものすごく嬉しいです。
“`ruby:new.html.rb
<%= javascript_pack_tag 'addForm.js'%><%= f.fields_for :ingredients do |ingredient| %>
<%= ingredient.text_field :name, id:"ingredient-name_0", p動的に表示したDOMに対してjQueryでfocus()する方法
jQueryの.focus()を使ってinputタグに自動的にマウスカーソルのフォーカスを当てようとしていたのだけれど、うまくいかない。
しかしこの方法で別のDOMに対してはfocusできていたので、jQueryのバージョンだとかそういう要因ではなさそうだった。よく考えると今回フォーカスを当てたいDOMは普段は隠れていて、ボタンを押した時だけ出てくるミニモーダルの中のinputタグだった。このボタンを手動で押してミニモーダルを開いた場合には自動的にフォーカスが当たるのだけれど、それ以外の方法(今回は onclick → trigger(“click”)による自動?クリックでミニモーダルを出現させていた)では動作していないようだ。
解決した方法:
ミニモーダルをdisplay:blockなりで出現させてから.focusするまでにsetTimeoutで100ミリ秒待つようにしたら普通に動いた。
ちなみに:
.focus()だけじゃなく.select()もこの方法で動いた。
せっかくなので.focusを.trigger(“focus”)に変えておい【Rails】ActionCableの実装〜mapメソッドについて〜
## はじめに
実装の流れは長くなるので省略させていただきます。
自分が疑問に思ってノートに記録した物を記事にしていきます。## 前提条件
Ruby 2.6.3
Rails 6.1.5## 外部キー制約
references型の特徴
**・外部キー制約がつかない。そのため、foreign_key: trueをつける。
・_idが省略される**中間テーブルに使用です。
“`php:migrate
# 外部キー制約:外部にその値を主キーとして持つ他のテーブルがあること
t.references :chat_room, null: false, foreign_key: true
“`## mapメソッド
中間テーブルのChatRoomUserから、条件を書いて配列を作ることで、
createする際の条件分岐に使用。ログインユーザーが存在しているチャットルームデータを取得
“`php:chat_rooms_controller.rb
ChatRoomUser.where(user_id: current_user.id).map(&:chat_room)
`Railsのヘヴィな重い一覧ページを改修したお話。
# 問題
User一覧画面、表示までに**20秒**ほどかかっていた。
メモリ食い過ぎで*サーバーが落ちる*こともあった# 結論
一覧画面に**不必要なモーダル**の切り分け
ハイパー**N+1**問題
を解決することで表示時間が1秒ほどになった。## 詳細
一部抜粋したコード(説明に不必要な箇所は省いています)
“`ruby:customers_controller.rb
CustomersController
def index
@customers = Customer.all
end
“`“`erb:index.html.erb
<% @customers.each do |customer| %><%= customer.mail %> <%= customer.foobar %> <%= customer.hoge %>