- 1. 複数環境に対応したRailsアプリケーションの設定方法
- 2. Rails6.2版 Relation配列指定でORクエリーを作る拡張
- 3. belongs_toをbelong_toと書いていたこと
- 4. 【Ruby on Rails】時間表示に関する記事いつも検索するからまとめてみた
- 5. ログイン前にトップページを表示させる方法
- 6. resourceとresourcesの違いについて
- 7. Railsのアセットについてざっくりまとめる
- 8. 【Rails】エラーメッセージ表示
- 9. rails g devise User を実行の際のエラーの話
- 10. LINE Messaging APIを使ってみる
- 11. Redmineからメンション付きでSlackにメッセージを送信する
- 12. Railsで共通の処理をどのようにまとめるか、考えてみた
- 13. flashについて
- 14. Active Jobについて知る
- 15. 開発環境のRailsアプリをDockerコンテナで起動してみた
- 16. 【Ruby on Rails】Rate.jsを使ったときに星が増えるバグの解消法(jQuery)
- 17. 例外処理について基本
- 18. [Rails]Mysql2::Error:Unknown column(フォロー機能)
- 19. カスタマイズしたvalidationチェックを行う
- 20. herokuデプロイ時にパスワードが要求された
複数環境に対応したRailsアプリケーションの設定方法
Railsには `RAILS_ENV`と呼ばれる環境を切り替えるための環境変数が用意されています. 最初はこれだけでも十分ですが開発が進むと環境毎に切り替えるプロジェクトがよくあるので備忘録として自分がよくやる対応をまとめてみました.
## config_for
`config/database.yml`の様に環境毎で切り替える設定は[config_for]というメソッドがあるのでこれを使うとスッキリ書けます.Rails6 であれば、 `shared` でマージされるのでデフォルト値が手軽に設定できます.
Rails5を使ってるのであれば、YAMLの[Anchors and Aliases]を使ってマージすると便利です.“`yaml
# config/foo.yml
—
shared:
key3: ‘shared value’base: &base
env: <%= Rails.env %>
key1: “<%= ENV['MY_APP_KEY1'] || 'default' %>”
key2: ‘hello %{user_cd}’produ
Rails6.2版 Relation配列指定でORクエリーを作る拡張
# 目的
Railsデフォルトのorだと、何らかの動的な仕様の都合でRelation条件配列として保持している場合、ORを適用するのが大変
“`ruby
first_condition = or_conditions.shift
or_conditions.inject(first_scope) do |merged_scope, scope|
merged_scope.or(scope)
end
“`# 理想
このような形でサクッとORクエリーを作りたい
“`ruby
User.where.or(*or_conditions)
“`# 実装
[Rails5版 OR クエリ構築するマン](https://qiita.com/ighrs/items/86ba018d74514e1196a3) のRails6.2版(merge! → and!)
Rails6.2からmergeが厳密になり、統合方法の指定が必要になり汎用拡張には使えなくなった、そのため条件の追加である and! を使ってRelationにOR条件を追加する
“`ruby
# initial
belongs_toをbelong_toと書いていたこと
# belongs_toをbelong_toと書いて、作業が止まってしまった。
かなり初歩的なミスですが、学習中にbelongs_toをbelong_toと書いて、この間違いを探し出せず作業が止まってしまいました。“`ruby:ruby
belong_to #belongsの s が抜けており、このままだとエラーが出ます。
“`“`ruby:ruby
belongs_to #なので、このように忘れずにbelongsと書きます。
“`
# さいごに
このミスは、「記述ミスが一つでもあると動かなくなる。」ということが改めて分かったことでもあります。この記事は自身のミスに常に目を光らせておくという戒めとして書きました。今後は自分のミスにいち早く気づけるようにしていきたいです。
【Ruby on Rails】時間表示に関する記事いつも検索するからまとめてみた
#対象者
* 時間の表示に関して調べている方
#目的
* 時間表示の方法を1つの記事にまとめて整頓する
#実際の手順と実例
###1.タイムゾーンタイムゾーンを日本時間にする方法を下記の記事を参考にさせて頂きました。
https://qiita.com/katsutakashima/items/1453ed0c97a818ddd731
““config/application.rb
module App
class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. config.time_zo
ログイン前にトップページを表示させる方法
# 内容
アプリを作成するにあたり、ログインする前でもトップページが表示されるように設定しました。
# 解決法deviceを使用してログイン機能をつけた場合、
“`application_controller.rb
before_action :authenticate_user!
“`を記述することで全てのコントローラーでアクションが動く前にログインしているかしていないかを判断され、ログインしていなければログインページにリダイレクトされるようになります。
“`routes.rb
root “tops#index”
“`
この状態では、root_pathにトップページを指定してもログインページに飛ばされてしまいます。どうにかしてtopsコントローラーでは before_action :authenticate_user! を無効化したいですね。
そんな時は、skip_before_action を使います。“`tops_controller.rb
class TopsController < ApplicationController skip_bef
resourceとresourcesの違いについて
# はじめに
本記事では、resourceとresourcesの違いについて記述します。# resources
`resources`とは、
7つのアクションへのルーティングを自動生成するメソッドです。resourcesの引数に、:itemsなどという+シンボルで指定すると/usersのパスに対応するルーティングが生成されます。
“`
% rails routesGET /items(.:format) items#index
POST /items(.:format) items#create
GET /items/new(.:format) items#new
GET /items/:id/edit(.:format) items#edit
GET /items/:id(.:format) items#show
PATCH
Railsのアセットについてざっくりまとめる
Rails内でアプリのJSやCSSとは関係ない描画用ページをつくることにしたのだが、アセット周りがよくわかってなかったので勉強したことについてまとめる。
## 用語
### アセット
静的なコンテンツのこと。主にフロント用のファイル(stylesheet, js, font, image等)
### プリコンパイル
public/assetsディレクトリにアセットをまとめたり、圧縮したりして設置すること
### マニフェスト
どのファイルをプリコンパイルするか決定すること## Sprockets と Webpacker
Railsにはアセットをパッケージするためのツールが2つある。SprocketsはもともとRailsに実装されていたもので、WebpackerはRails 6.0から標準実装されたWebpackをRailsに組み込むためのgemである。## プリコンパイルの流れ
プリコンパイルまでのフローはだいたい以下の通り1. 参照するディレクトリを設定
2. ディレクトリにファイルを設置
3. マニフェストを作成
4. プリコンパイル## Sprockets
##
【Rails】エラーメッセージ表示
# 目標
* エラーメッセージを表示させる
![スクリーンショット 2021-08-29 20.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927584/7393e52e-4229-c9c5-2c43-0cf10cc95c3f.png)* ユーザーの登録や投稿がなんで失敗したか知らせてくれるメッセージ
# 実装
エラーメッセージのファイル作成“`erb:app/views/layouts/_error_messeages.html.erb
<% if model.errors.any? %><% model.errors.full_messages.each do |message| %>
- <%= message %>
<% end %>
rails g devise User を実行の際のエラーの話
## 背景
rails g devise User を実行の際、以下のエラーが発生“`
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:PG::DuplicateColumn: ERROR: column “email” of relation “users” already exists
“`エラー文を見ると、どうやら**usersテーブルが重複**しているようだ。
## 試した事
`rails db:migrate:reset`
しかし、“`
rails aborted!
ActiveRecord::NoEnvironmentInSchemaError:Environment data not found in the schema. To resolve this issue, run:
bin/rails db:environment
LINE Messaging APIを使ってみる
## 概要
LINEのMessaging APIを使ってみる。
Railsでサーバー立ち上げて、実際にWebhookでどんな値が連携されるのか見ていきます。
(公式にあるのかもだけど見当たらなかったので)
ただ、Messaging APIの動きを見たいだけなので環境とかは適当に作ります。
誰かの役に立てば嬉しいです。## RailsのDockerイメージを作る
以下をまるまる真似してDockerでRailsが動くところまでやった。
– [DockerでRuby on Railsの環境構築を行うためのステップ【Rails 6対応】
](https://qiita.com/kodai_0122/items/795438d738386c2c1966)と、言いたいところだったけど、postgressのイメージバージョンの影響で動かないところがあった。
以下の対応でとりあえず回避した。
– [PostgresのDockerImageに変更があって起動ができなくなった話
](https://qiita.com/tomopict/items/23cc4332781bb28d2973)Redmineからメンション付きでSlackにメッセージを送信する
#### View Customize Pluginを使って、Redmineの注記をSlackで共有する機能をつけてみました。####
処理の手順は、以下のようになっています。
– View Customize Pluginを使ってSlackに送信するデータを準備する
– クライアント側から、サーバ側に配置したコントローラをAjax通信で呼び出して実行する
– サーバ側はデータをSlackにPOSTするだけ機能のイメージは以下のようになります。
Redmineのチケット詳細画面・履歴の注記に追加した「Slackで共有」ボタンをクリック
![注記コメント内容.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/761560/3b77c1b9-e5be-e433-fdf3-3e17f532d062.png)
Slackにメンション付きでメッセージが送信される
![Slackメッセージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonawsRailsで共通の処理をどのようにまとめるか、考えてみた
# 記事を書くにあたって
Railsで実装を行なっている際に同じ処理が複数の箇所に記載されてしまうため、モヤモヤして色々と調べた結果です。他にもこういったものがあるよ! とコメント欄で教えていただけると嬉しいです! ポリモーフィック関連付と単一テーブル継承に関しては私自身あまり理解していないので、今回の項目からは除外しています。(個人的にはメリットよりデメリットを大きく感じる……)# Railsで共通の処理はどう実装するの?
concern、merge、extendingを紹介いたします! これらを使用すれば、共通の処理をまとめることができるのではないかと考えています!# concern、merge、extendingはそれぞれ何を共通化できるの?
| 機能 | 共通化できるもの |
| —- | —- |
| concern | モデルのクラスやインスタンスに対しての処理 |
| merge | scope(他のモデルのscopeを呼び出すことが可能になる。) |
| extending | モデルの集合のインスタンスに対しての処理 |# 説明の
flashについて
# なぜ書くのか?
flashで表示すべきか?htmlで表示するべきか?を判断するときに、それぞれの技術の性質や役割を理解していないために、どちらを使えば良いのかを判断ができなかった。またそれらの技術の特徴を理解する以前に、基本的なこと(ブラウザのリクエスト、レスポンス、セッション(Cookie))についての理解が曖昧なために、どれだけ説明をよんでもちゃんと理解できなかった。そのため、本記事では研修で学んだ基礎的なことの復習をし、flashの技術の性質を理解するためにかく。# 基本的なことのおさらい
## HTTPとはHTTPとはWebサーバとWebブラウザの間で情報のやり取りをするための通信規則です。(プロトコル) 例えばgoogleでサイトを閲覧するときも、このプロトコルに則ってブラウザがサーバーにリクエストし、その結果サイトを閲覧することができている。
HTTPの特徴として、常にブラウザ側からサーバーをよびだし、1つの要求(リクエスト)には1つの応答(レスポンス)を返すこと。そして、以前に何を要求したかで応答が変わることなく、同じ条件ならば、ある要求に対する応答は常に同
Active Jobについて知る
## なぜ書くのか?
ユーザー登録時にslackに通知する機能を実装した際に、他の実装を真似て`ApplicationJob`を継承した。実装自体はできたが、`Active Job`の役割は非同期処理をするくらいの認識で、その仕組みについてしらないことだらけ。なので、Railsガイドに参考に分からない単語を調べたり、実際に実装してみて確かめながら理解を深めていくことにする。### Active Jobの目的
>Active Jobの主要な目的は、あらゆるRailsアプリケーションにジョブ管理インフラを配置することです。これにより、Delayed JobとResqueなどのように、さまざまなジョブ実行機能のAPIの違いを気にせずにジョブフレームワーク機能やその他のgemを搭載することができるようになります。バックエンドでのキューイング作業では、操作方法以外のことを気にせずに済みます。さらに、ジョブ管理フレームワークを切り替える際にジョブを書き直さずに済みます。[rails](https://railsguides.jp/active_job_basics.html#active-
開発環境のRailsアプリをDockerコンテナで起動してみた
#目次
[1.はじめに](#はじめに)
[2.前提](#前提)
[3.大まかな手順](#大まかな手順)
[4.dockerの設定ファイル作成](#dockerの設定ファイル作成)
[5.アプリ用コンテナとデータベース用コンテナの接続設定](#アプリ用コンテナとデータベース用コンテナの接続設定)
[6.コンテナ起動](#コンテナ起動)
[7.まとめ](#まとめ)#はじめに
先日、Railsで学習系のWebアプリを作成しましたが、環境構築の際は、何かしらエラーが出ては原因を調べて解消の繰り返しでした。様々な知識を得る良い機会ではあったのですが、今後、開発をする際はより効率的にできたらなという思いがあります。解決手段の1つとしては「Docker」が挙げられるかと思います。次にアプリ開発をする際は初期段階からDockerを用いた開発をしたいと考えていますが、まずは今回作成した既存のアプリをDockerコンテナで起動できないか試してみましたので、記録として残します。#前提
・開発端末にてDockerをインストール済であること
・以下の手順における各ソフトウェアバージョンは次の通り
・Ru【Ruby on Rails】Rate.jsを使ったときに星が増えるバグの解消法(jQuery)
#対象者
* レビュー評価を実装している方
* 星が増える不具合を実装している方![スクリーンショット 2021-08-29 7.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/c2c3092d-870d-e1b9-087e-2120ef2c21b6.png)
#目的
* 星が増える不具合を解消して、星を5個で収める
#実際の手順と実例
###1.結論(解決策)**scriptタグに$(”).empty();を追加すればOK!**
下記例です
div.rateの部分は人によって違うと思います。“`