Rails関連のことを調べてみた2022年09月10日

Rails関連のことを調べてみた2022年09月10日

オリジナルアプリのコメント機能を非同期で投稿出来るように変更した時の備忘録

オリジナルの写真と投稿アプリを作成した時にコメント機能に後からAjaxで実装してみようと思ったらかなり手こずったので忘れない為に備忘録を残します。
投稿した写真にログインしたユーザーがコメント出来る機能になってます。

### コントローラーの編集
投稿した写真の詳細ページにコメントしたいのでアクションはcreateとdestroyの二つ
画面遷移はしたくないのでrenderやredirectの記述はしない
@comment = Comment.find(params[:id])をdestriyメソッドの下に書くと意味がないので一番上に記述する
“`:comments_controller.rb
def create
@post = Post.find(params[:post_id])
@comment = Comment.new(comment_params)
@comment.save
end

def destroy
@comment = Comment.find(params[:id])
@post = Post.find

元記事を表示

【Ruby on Rails】愛犬管理アプリpart2 ~タスク編~【初心者向け】

# 本記事の内容
本記事は、[こちら](https://qiita.com/tak8_al/items/08274dd9228363642555)の記事の続編です。
その記事で実装した内容をもとに、実装していきますので、まだご覧になっていない方は、ぜひご覧ください。
以下の内容の実装方法だけ知りたいという方は、このままご覧ください。

## 本記事での実装内容
① 実行時間の情報を持ったタスクの作成機能
② 当日のタスクのみ表示する機能
③ 全ての実行日の情報を持ったカレンダー作成機能
④ どのペットに対するタスクか表示する機能
⑤ タスクを実行する人間を表示する機能
⑥ 実行時間に自動メール送信する機能
⑦ タスク完了時にメール送信機能

では実装していきましょう。

# 実行時間の情報を持ったタスクの作成機能
タスクの実行時間がindexページに表示されるタスクアプリケーションを作成します。
手順は2つです。!

* CRUD機能を持ったアプリケーションの作成
* 時間を日本時間に変更

順に実装していきましょう。

## CRUD機能を持ったアプリケーションの作成

Scaffo

元記事を表示

[エラーメッセージ]”ActiveRecord::PendingMigrationError”解決までの流れ

# 1.前提条件
#### 開発環境
Ruby:ruby 3.1.2
Rails:Rails 6.1.6.1
OS:Windows11 Home

# 2.エラーメッセージの内容

![error_img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823804/86d78dc1-3403-0fb3-1814-8ee88992c7f5.png)

#### ②エラーメッセージ翻訳
エラーメッセージを翻訳する
 
 ”移行は保留中です。 この問題を解決するには、次を実行します。
  bin/rails db: RAILS_ENV=development を移行
  保留中の移行が 1 件あります:
  20210727061455_create_books.rb”

#### ③エラーの原因を考える (※考えられる原因は随時追記することとする。)
今回のエラーはmigrateし忘れているというものである。
考えられる理由を下記に記述する。

 ・単純にrails db:migrateし忘れている

#

元記事を表示

本番環境でActionMailerを動かす 【Rails Heroku Gmail】

## 環境

– Ruby3系
– Rails6系
– Heroku
– Gmail
## 実現したいこと
– ActionMailerを使って本番環境でパスワードリセットメールを送信できるようにしたい。
## 現状

– 本番環境でメール送信できない。(ActionMailerがうまく動かない)
– 開発環境ではうまく動いている。(letter oppner webで確認した。)
– エラーがいくつか発生した。`Rails Missing host to link to!`や`Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)`**といったエラー。
## 解決策
一言で言うとdevelpment.rbの編集とGmailの設定をしないといけない。
これをやっていなかったのでうまくいかなかった。
## Gmailの設定
Gmail側の設定については以下の記事が参考になった。
[https://skillhub.jp/courses/137/lessons/97

元記事を表示

Basic認証の導入(健忘録)

## RailsのAppにBasic認証を導入する

全てのコントローラーで行いたいため`application_controller.rb`に記述する

“`app/controllers/application_controller.rb
class ApplicationController < ActionController::Base before_action :basic_auth private def basic_auth authenticate_or_request_with_http_basic do |username, password| username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"] # 環境変数で呼び出す end end end ``` ## (補足) 環境変数の設定 vimコマンドで設定ファイルの`.zshrc`に記述する ```:ターミナル % vim ~/.zshrc ``` 通常モー

元記事を表示

編集ページをモーダルで表示したのでメモ

### Bootstrapでモーダルを使用した投稿機能を実装したので編集もモーダルで編集したかったので実装してみた

Bootstrap5とJQueryはCDNで読み込んでいる。
コントローラーは通常通り記述
“`:recioes_controller.rb
def index
@recipes = Recipe.all
@recipe = Recipe.new
end

def create
Recipe.create(recipe_params)
@recipes = Recipe.all
end

def edit
@recipe = Recipe.find(params[:id])
end

def update
@recipe = Recipe.find(params[:id])
@recipe.update(recipe_params)
redirect_to root_path
end

def destroy
recipe = Recipe.find(pa

元記事を表示

ActionCable ルーム別チャット

## やりたいこと
複数のチャットルームが存在し、チャットルームごとにメッセージを表示する。
## やるべきこと
これを実現するには「ユーザーがどのチャットルームに属しているか」という情報を、ActionCableの各処理に渡さなければいけない。
## 前提
リアルタイムチャット機能は既に実装済み。
## 用語
ルーム別チャットを実現するにはActionCableに関する用語やデータの流れを理解しておいた方が捗る。この図説付きの記事が分かりやすかった。([https://qiita.com/ksugimori/items/d5f4630858eeb56d9da5](https://qiita.com/ksugimori/items/d5f4630858eeb56d9da5))
## 手順
1. チャットルームにid属性を持たせる
2. ビューから特定のユーザーとチャットルームの情報を取得する
3. 取得したユーザーとチャットルームのパラメータをサーバー側に送る
4. パラメータをもとにデータを取得する
5. パラメータをもとにストリームを作る
6. ストリームを指定してブロードキャスト

元記事を表示

【Rails】過去の記事がN+1問題そのものだったので修正する

# 目的

現役Webエンジニアの知り合いに[過去に書いた記事](https://qiita.com/ysk91_engineer/items/4fc6bdccb173fd21a97b)を自慢げに見せたところ、
**N+1問題って知ってる?**
と言われました。

[クロノスタシス](https://youtu.be/cCx4I4Fk5FE)よろしく、「知らな~い」と答えたところ、下記記事を紹介して頂いたのでこちらを参考に修正しました。

https://pikawaka.com/rails/includes

# 早速修正だ!

そもそもN+1問題というのは、**`has_many`で紐づけしたテーブルを呼び出す際に、いちいち全てのデータを参照して引っ張ってくること**だと理解しました。
これによってデータベースへのアクセスにかかる時間が長くなり、サーバに負荷がかかってしまいます。

## モデルで主従関係を明らかにする

過去記事では触れていなかったモデルについて言及します。
今回、Genreモデルが主、Hogeモデルが従の関係になっているので、
“`ruby:genre.rb

元記事を表示

Rails Heroku error: failed to push some refs to ~が出た時

今回、Herokuのリリースで`error: failed to push some refs to ~`のエラーが
出たのですが、うまくまとまっている記事がなかったので、まとめました!
(何か誤りがあれば、コメントください?)

# error: failed to push some refs to ~の種類
1. pushするブランチ名の誤り
1. config/database.yml中に記述ミス
1. HerokuのサポートするRubyのバージョン違い

# 1. pushするブランチ名の誤り
こちらは至極簡単で、コマンドを変更するだけで良いです!
“`zsh:ターミナル
# デフォルト(git branch -M mainなどしていない場合)
% git push heroku master

# デフォルトのブランチ名がmainの場合(git branch -M mainしている場合)
% git push heroku main

# 現在のブランチ名がデフォルト以外の場合, 今回のブランチ名はdev
% git push heroku dev:master
“`

元記事を表示

Rails7 devise_token_authエラー

### エラー内容
“`
gem ‘devise’
gem ‘devise_token_auth’
“`
Gemfileに上記の2つを追加して
“`
$ bundle
“`
を実行すると
“`
Fetching gem metadata from https://rubygems.org/………
Resolving dependencies….
Bundler could not find compatible versions for gem “rails”:
In snapshot (Gemfile.lock):
rails (= 7.0.3.1)

In Gemfile:
rails (~> 7.0.3, >= 7.0.3.1)

devise_token_auth was resolved to 0.1.21.alpha2, which depends on
rails (~> 4.1.4)

Running `bundle update` will rebuild your snapshot from sc

元記事を表示

ActiveAdminでhas_manyな要素の追加するボタンの表示制御

“`active_admin.scss
/* ActiveAdminでhas_manyな要素の追加するボタンの表示制御 */
li.has_many_container {
.inputs.has_many_fields + a {
display: display;
}
.inputs.has_many_fields:nth-of-type(5) + a.has_many_add {
display: none;
}
.inputs.has_many_fields:nth-of-type(5) + input + a.has_many_add {
display: none;
}
}
“`
nth-childではまったので注意

元記事を表示

【Ruby on Rails】devise_invitableを使った招待機能実装編 【初心者向け】

# 本記事の内容
[初心者向け] ポートフォリオに愛犬管理アプリを作ってみた話[Ruby on Rails]の付属記事です。
ご覧になっていない方は、[こちら](https://qiita.com/tak8_al/items/08274dd9228363642555)からご覧ください。

devise_invitableの使い方だけ知りたい!という方は、このままご覧ください。
当記事は、Deviseの実装は一通り終わっていてサインインもサインアップも実装できている前提です。
まだ行っていない方は、[こちら](https://qiita.com/tak8_al/items/265b080674456398d56e)をまずはご覧ください。

# 開発環境
MacBook Air (M1, 2020)
Rails 6.1.6.1
ruby 3.0.1
yarn 1.22.19

# 導入手順
* devise_invitableの導入
* 招待用のカラムの追加
* 招待ページの生成
* ユーザー名の追加
* routing設定
* 導入確認

順にやっていきます

# devise_invi

元記事を表示

[Ruby on Rails]deviseを使用したログイン機能実装 [初心者向け]

# 本記事の内容

[初心者向け] ポートフォリオに愛犬管理アプリを作ってみた話 [Ruby on Rails]へのdevise導入編になります。
ご覧になっていない方は、[こちら](https://qiita.com/tak8_al/items/08274dd9228363642555)からご覧ください。

deviseの使い方が知りたい方は、この記事で完結させますので、このままご覧ください。
CRUD機能を持ったアプリケーション実装済みの方を対象にしていますので、まだの方は実装してから、ご覧ください。

# 開発環境
MacBook Air (M1, 2020)
Rails 6.1.6.1
ruby 3.0.1
yarn 1.22.19

# 本記事での実装機能
* deviseの導入
* 新規登録時に名前を入力できるようにする
* ユーザー画面作成

# deviseの導入
deviseを導入するにあたって、やる工程は4つです。
①Gemfileに追記
②deviseの設定ファイルの作成
③Userモデルの作成

順に説明していきます。

## ①Gemfileに追記
早速アプリ

元記事を表示

devise実装手順

## 毎回devise導入時コマンド忘れるので書き残しておく。
以下のコマンドは一貫して行う。

“`ruby:Gemfile
gem ‘devise’
bundle
“`
“`ruby:ターミナル
$ rails generate devise:install
$ rails generate devise user // モデル

その後、何かカラムを追加してから
$ rails db:migrate
$ rails generate devise:views
“`

元記事を表示

Formオブジェクトのedit定義

例えばitemsテーブルとtagsテーブルの2つを合わせたFormオブジェクトがあったとしたら、それを編集するためのeditアクションは下記のようになる。

“`items_controller.rb
def edit
@item = Item.find(params[:id])
@tag = @item.tag
item_attributes = @item.attributes
tag_attributes = @tag.attributes
item_tag = item_attributes.merge(tag_attributes)
@item_tag = item_tag.new(item_tag)
end
“`
attributesメソッドでそれぞれの値をハッシュとして取り出し、それらをmergeメソッドでハッシュを結合することで、編集したいitem_tagの情報を取り出すことができる。

元記事を表示

【初学者向け】Rails(ActiveRecord)でselfの理解を深める – インスタンスメソッド クラスメソッド –

# はじめに
本記事は、著者自身のクラスに対する理解を深めるために
例を用いてクラスについて解説していく記事となります!

# 対象の読者像
・Railsでselfの使い方がイマイチ掴めていない方
・Rails触ったことあるけどselfの理解が曖昧な方

# 基本事項
“`ruby:example.rb
class Example
attr_accessor :name

def initialize(name)
@name = name
end

def self.ikemen
self.name
end

def busamen
self.name
end

end
“`
さて、問題です!

## 問1
クラスメソッドはどれのことを指すでしょうか?

答え

“`rb
def self.ikemen
self.name
end
“`

## 問2
問1のクラスメソッドはどのように呼び出すでしょうか?

元記事を表示

deviseの遷移先の指定はどうするか

## application_controller.rbへ記述する
“`
def after_sign_in_path_for(resource)
user_path // ユーザー詳細画面に遷移
end

def after_sign_up_path_for(resource)
user_path // ユーザー詳細画面に遷移
end

def after_sign_out_path_for(resource)
new_user_session_path // ログイン画面に遷移
end
“`

application_controller.rbに上記のような記述をするだけで、deviseで新規登録した後の遷移先、ログインした後の遷移先、ログアウトした後の遷移先を指定できる。

元記事を表示

[Rails SQL] Cannot delete or update a parent row: a foreign key constraint fails の解決法

## 前提
progamesテーブルとchatroomsテーブルが1対1の関係。(progamesテーブルがchatroomsテーブルを持っている。)

## 発生しているエラー
SQL文のdeleteメソッドでpro_gamesテーブルのレコードを全て削除しようとすると以下のエラーが発生。
“`
Cannot delete or update a parent row: a foreign key constraint fails
“`

## 解決
先に親を消しているのが原因。子を先に消しておくとうまくいく。
(今回の場合だとchatroomsテーブルから消しておく。)
## なぜ親からだと削除できない??
モデルに`dependent: :destroy`を書いているのになぜ削除できない??
“`ruby
class ProGame < ApplicationRecord has_one :chatroom, dependent: :destroy end ``` ## 原因発覚 SQL文で削除しようとしたことが原因。 ```ruby resources :pro_g

元記事を表示

実行中のRubyサーバ上でsidekiqプロセスが動いているか確認するコマンド

ググっても出てこなかったのでメモ
“`ruby
Sidekiq::ProcessSet.new.map {|ps| ps[‘hostname’] }.include?(Socket.gethostname)
# または
Sidekiq::ProcessSet.new.map {|ps| ps[‘hostname’] }.include?(`hostname`.strip)
“`

ちなみに `Socket.gethostname`, “ `hostname`.strip “ は「Ruby のプロセスが稼働しているサーバの hostname を取得する」コマンドのようです。
`Socket.gethostname`の方は、ruby 2.7以降ではdeprecatedとのことです。

#### 参考
– https://qiita.com/notakaos/items/368f2e1b3c4d672e2c04
– https://stackoverflow.com/questions/42566/getting-the-hostname-or-ip-in-ruby-on-rails

元記事を表示

.tryというよりガッツだぜ

こちらはプログラマーなりたてのへっぽこパンピーが、自分の自分による自分のための忘備録として書いてるので、間違いもがあるかもですがあしからず!

# よく見かけるけど喋ったことない人
って割かし多いと思いますが、そのよく見かける人と話す機会がある時に、なんて言葉をかけるかで、人間性が垣間見えますよね。
「**あ、いつもお互いに見かけますよね!**」と堂々と言える人はもいますけど、「**いつも見てると思われたらどうしよう**」と考えて、ちょっと奥手になる人もいますよね。

その繊細な心模様については各自で考えてもらうとして、僕にとってよく見かけるけど見ないふりをしてた人が「.try」なんで、ちょっと軽く声をかけてやろうと思い調べてみました。
“`ruby
“hoge”.try(:to_i)
“`
こいつですが、わりとコード上に頻出するんで、「Try、Try、Try」と頭の中でウルフルズがちらつき出すんで、それを食い止めるために調べてみました(**表題のくだりはここで華麗に回収できたので一安心です**)。

# .tryでnilを返してくれる
急に真面目に書くと、tryはメソッドが定義さ

元記事を表示

OTHERカテゴリの最新記事