Ruby(Ruby on Rails)

「A server is already running...Check...server.pid.」「Address already in use」でRailsのサーバーが起動できなかった時の対処法

【結論】 ・Railsのサーバーが正常終了しなかった場合、エラーで以降サーバーが正常に起動しなくなる場合がある ・A server is already running...Check.../tmp/pids/server.pid.が表示された場合、ターミナルを再起動するか、server.pidを削除する ・Addres…

関連付け先のモデルのバリデーションを実行する「validates_associated」(Rails)

【結論】 ・validates_associatedは、関連付けられていている他のモデルのバリデーションを実行することができるヘルパー ・オブジェクトを保存しようとすると、関連付けられているオブジェクトごとにvalid?が呼び出される ・validates_associatedを、関連付…

Railsのモデルのインスタンスは、カラム名の後に「?」を付けると値の有無を判定できる

【結論】 ・Railsでは、blank?やpresent?で、オブジェクトの有無を判定することができる。 ・モデルのインスタンスの場合、カラム名の後に?を加えることで、属性(attribute)に値が入っているか判定することが出来る ・後者の方が、コードがシンプルになる…

link_toのちょっと使えるオプション(Rails)

【結論】 ・data-confirmを指定すると、リンクにアクセスする前に、確認用のポップアップを表示させる事が出来る ・target: :_blankを指定すると、リンクを別タブで開く様になる ・link_to_unless_currentメソッドを利用すると、現在のページのリンクのパス…

「presence」を知ると「present?」で実装したコードをリファクタリングしたくなる問題(Rails)

【結論】 presenceメソッドとは、RailsのActiveSupportによって提供されるObjectクラスのメソッド。 レシーバーがnilの場合はfalseを返し、nili以外の場合はレシーバーを返す。 存在の有無を判定してからオブジェクトを返す条件式を書く場合h、present?より…

「.png」「.jpg」などの拡張子が付くパスだと、「404」のエラーハンドリングが機能せず「Missing template」になる問題(Rails)

【結論】 ・存在しないパスにアクセスした場合、エラーハンドリング で指定した「404」のビューファイルに飛ぶ様に設定しているにも関わらず、「.png」や「.jpg」といった拡張子で終わるパスにアクセスした場合、「Missing template」になることがある。 ・…

CookieStoreによるセッション管理について

【結論】 ・CookieStoreとは、Railsのデフォルトで用意されているセッション管理方式 ・セッション情報を暗号化して、ブラウザのCookieに保存することで、DBへのアクセスが不要となるため、処理が高速。 ・セッション再生攻撃のリスクと、Session情報を自由…

Railsでデータの初期値を設定する方法(DBとモデルの設定パターン)

【結論】 ・Railsでデータの初期値を設定するには、DB側で設定する方法と、モデルで設定する2通りが存在する ・DBで設定する場合は、マイグレーションファイルの該当カラムのオプションにdefault値を設定する。 ・モデルで設定する場合は、after_initialize…

テキストのURLを<a>タグに適応させるgem「Rinku」(Rails)

【結論】 ・テキスト中のURL部分だけに自動でリンクを適用させて表示させたい時に有用なのがRinkuというgem ・RinkuはコードがCで記述されており、RegExの置き換えではなく実際の解析を行うため、実行が約20倍高速 ・自動リンクする対象を指定したり、外部リ…

default_scopeは悪だとRuboCopに怒られたので理由を探る(Rails)

【結論】 ・あるモデル全体にスコープを適用したい時、default_scopeを利用するとデフォルトで設定が出来る。 ・但し、既定のスコープを上書きすることはできず、モデルの初期化に影響することから、使用を推奨しない意見がある。 ・反対意見も存在する為、…

「simple_format」や「safe_join」を使って、正常に改行表示させる方法(Rails)

【結論】 ・text_areaのフォームは改行も入力可能だが、そのままデータをビューも出力しても、改行は反映されない。 ・simple_formatを利用すれば、<br><p>タグを自動的に付与して改行表示をさせる事が出来る ・なお<p>タグを付けたく無い場合には、safe_joinを利用す</p></p>…

「active_link_to」で表示中のページのリンクへ動的にclassを付与する方法

【結論】 ・active_link_toとは、Railsのgemの一種。link_toと同じように、リンクを生成する「active_link_to」メソッドを利用できるようになる ・「active_link_to」メソッドは、リンク先のページを開いていると、リンクに「class=“active”」を付与する ・…

長い文字を「...」で省略する方法(Ruby・Rails・JavaScript)

【結論】 ・文字を省略したい場合、Railsであれば、truncateメソッドを利用する方法がある ・Rubyであれば、範囲オブジェクトで文字の範囲を指定して、表示をさせる事 ・JavaScriptの場合は、slice() メソッドで文字の省略が可能 【目次】 文字数を省略させ…

shadowing outer local variableという警告文について(ローカル変数とブロック変数を同じ名前にした場合)

【結論】 ・shadowing outer local variableは、ローカル変数とブロック変数を同じ名前にした場合などに、出力される警告文 ・ruby -wのオプションで警告文を出力させる様に指定しない限り、そのままプログラムが実行される ・警告文を無視して実行する際は…

seed-fuでシードファイルをもっと便利に

【結論】 ・Railsにはrake db:seedで初期データを投入する方法が標準で備わっている ・しかし、環境毎に内容を分けたり、一度作成したデータは投入しない様にしたりといった細かい調整が面倒 ・seed-fuというgemを用いれば、それらの設定を簡単に行える 【目…

credentials.yml.encによるアクセスキーの管理方法

【結論】 ・Rails5.2以降から、secrets.ymlは廃止され、代わりにcredentials.yml.encが導入された ・credentials.yml.encは暗号化されている為、master.keyで復号化しないと編集は出来ない ・master.keyはデフォルトでgitignoneに登録されている 【目次】 ア…

rescue_fromなどを用いたエラーハンドリングをリファクタリング

【結論】 ・例外をキャッチする方法として、begin~rescueメソッドがあるが、メソッド全体を指定する場合、beginは省略可能 ・rescue_fromを利用すれば、指定したコントローラー全体の例外をキャッチする事が可能 【目次】 エラーハンドリングのリファクタリ…

エラーページの実装方法

【結論】 ・Railsでは、エラーが発生した場合、デフォルトで設定されたエラー画面が表示される ・このエラー画面を任意の内容に変更する事が可能である ・なお、HTTPエラー毎に、エラーを検知する為のコードを記述する必要がある 【目次】 エラーページにつ…

ファイルアップローダー「CarrierWave・Shrine・ActiveStorage」の比較

【結論】 ・CarrierWaveは、一通りの機能を備えており使用実績も多い。 ・Shrineは、必要な機能のpluginだけ選択して読み込む事が出来る。 ・ActiveStorageは、Ralis5.2から標準装備されたファイルアップローダー。 【目次】 Railsのファイルアップローダー…

多対多を表現する為の関連付け(has_many through、has_and_belongs_to_many)

【結論】 ・テーブル間の多対多の関係を表す関連付けとして、has_many throughと、has_and_belongs_to_manyが存在する ・has_many throughは、中間テーブルのモデルに何らかの処理を記述したい場合に用いる ・has_and_belongs_to_manyは、中間テーブルのモデ…

名前付きルートを使用する利点

【結論】 ・名前付きルートとは、「パスpath」「パスurl」などの形式で、リンク先のURLを指定出来るヘルパー ・URL構造を気にせずにパスを指定出来るメリットがある ・また、SQLインジェクション対策としても用いられる 【目次】 名前付きルートについて URL…

ポリモーフィック関連付けについて

【結論】 ・ポリモーフィック関連付けとは ある特定のモデルが他の複数のモデルに属している事を 一つの記述だけで表す手法 ・画像などを一つのモデル(テーブル)で 集約して管理したい場合に有用 ・ポリモーフィック関連付けの元となるテーブルの 外部キー…

f.objectの仕組み

【結論】 ・f.objectのobjectは、 form_withやform_forなどのオプション ・formのブロック変数に対して使用する事で ブロック内でモデルオブジェクトを 呼び出す事が出来る。 ・同じコードを流用する際に、 変数を変える必要が無くなる 【目次】 f.objectに…

bin/setupの処理内容について

【結論】 ・bin/setupでは、下記の処理を行っている。 ・gemの依存関係のチェック、インストール ・データベースの再構築 ・古いログと一時ファイルの削除 ・サーバーを再起動 【目次】 bin/setupの処理内容 実行結果 Installing dependencies Preparing dat…

「pry-rails、pry-byebug、pry-doc」それぞれの役割について

【結論】 ・pry-railsは、 ソースコードに「binding.pry」を埋め込む事で そこがブレークポイントにデバックが出来る ・pry-byebugは、 binding.pry で止めたところから next コマンドで一行ずつステップ実行ができる ・pry-docは、 Cで書かれたRubyのソース…

with_indexによる繰り返し処理のカウント

【結論】 ・with_indexとは、 eachやmapなどで繰り返しの処理をした際、 現時点の繰り返し回数をカウントしてくれる。 ・引数を指定する事で、 カウント開始時点の数を任意で決められる ・eachの場合、each_with_indexという with_indexメソッドの機能が あ…

削除系メソッド(delete, delete_all, destroy, destroy_all)について

【結論】 ・deleteは、指定した条件のレコードに対して SQLのDELTE文を直接実行する。 その為、関連付けられてるレコードは削除されない。 ・destroyは、ActiveRecordを介して 指定した条件のレコードを削除する。 関連付けられてるレコードも削除される。 …

「render」「redirect_to」の違い

【結論】 ・「render」「redirect_to」共に ページを更新させる為のメソッド ・「render」は指定したviewファイルを呼び出し、 「redirect_to」は指定したパスにアクセスする ・エラーで元の画面に戻したい場合は「render」 データを更新してページを表示さ…

Rakeタスクとは

【結論】 ・Rakeタスクとは、行いたい処理を ターミナルなどのコマンドライン上から 実行できる機能の一つ ・CSVインポートやデータの整理など、 アプリケーション側にインターフェイスを 設けていない処理を実行する際などに用いられる 【目次】 Rakeタスク…

配列の重複した要素を取得するメソッドが無い問題とその対処方法

【結論】 ・Ruby(Rails)では、 重複した値を除去するメソッドは用意されているが、 重複している値を取得するメソッドは存在しない ・重複した値を取得する場合は、 複数のメソッドを組み合わせて 処理を行う必要がある ・「array.group_by{|i| i}.reject{…