セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

rails

【Rails5】Administrateのスタイルシート読込先を変更する

やること 管理画面生成のgemadministrateにてRailsのデフォルトのスタイルシートapplication.cssから、スタイルを読み込ませる方法。そんなに難しいことはしません。 方法 以下のコマンドで_styoesheet.html.erbを生成します。これでadministrateのデフォル…

【Rails】登録内容がユニークでないユーザへの条件別対応

例えば ユーザが電話番号で仮登録をし、認証のためのURLを生成して返す場合、同じ電話番号を使って再度仮登録の内容をPOSTしてくる場合がある。1時間以内に2回送ってくる人は恐らくイタズラに近い可能性があるのでエラーを返すが、それ以降に再度送ってき…

【Rails】コールバックで自分以外のレコードとユニーク判定を行う

解決 レアケースだと思いますが、バリデーションのコールバックでhoge_columnsという属性のユニーク判定をしたい場合です。特に難しいことはなく、下のようにやります。 User.where(hoge_columns:self.hoge_columns).where.not(id: self.id).empty? 本来なら…

【Rails】Administrateでモデルを持たないページ(Rootページ)を作成

Administrate 今回使用したバージョン トップページ gemの特性 解消法 Administrate 管理画面を簡単に作れるgemで、カスタマイズが他のものよりも容易である点が特徴っぽいです。 github.com 今回使用したバージョン # Gemfile.lock administrate (0.11.0) a…

【Rails5】find_by(nil)が先頭レコードを返す

find_by find_byメソッドは、検索するカラムとその条件を指定してそのレコードのうち最初の一件を取得します。例えばfind_by(id: 1)ならidが1のレコードを返します。 find_by(nil) -> nil ??? 使い方は正しくはありませんが、この使い方をするとnilが返って…

【terraform+capistrano+itamae】Railsのアプリケーションをawsにデプロイした時の備忘録③

目的 itamae itamae呼び出し方法 レシピ dependencies users ruby その他 MySQL capistrano側の変更 余談 前回はcapistranoでデプロイをする部分をやった。が、デプロイ先のaws内の準備は手動でやったので、その部分をitamae自動化したい。 thinline196.hate…

【terraform+capistrano+itamae】Railsのアプリケーションをawsにデプロイした時の備忘録②

Capistrano 参考サイト 使用Gem capistrano設定 config/deploy/production.rb config/deploy.rb lib/capistrano/tasks/unicorn.rb config/unicorn/production.rb 環境変数 awsのRDBを使用する プライベートリポジトリからdeployする デプロイ実行 その他対処…

【terraform+capistrano+itamae】Railsのアプリケーションをawsにデプロイした時の備忘録①

参考サイト terraform 設定(main.tf) 参考サイト 基本的にこちらを参考にしているため、こちらを見れば諸々解決可能です。本記事は備忘録なので見にくいかも。 tech.recruit-mp.co.jp kenzo0107.hatenablog.com terraform terraformとは インフラストラクチ…

【Rails】git-cz, rubocopなど初期導入での設定

新規のRailsのプロジェクト yarnの導入 npmのモジュールの導入 package.jsonに追記 rubocop.ymlの設定 .cz-config.js おまけ 新規のRailsのプロジェクト を久しぶりに立ち上げた際に、git-cz等の導入方法を忘れていたので備忘録として残しておきます。 yarn…

【RSpec】includes, preload等のキャッシュのテスト

よくググり直すので備忘録。 Rails: ActiveRecord関連付けのpreload/eager-loadをテストする2つの方法(翻訳) ### scope :with_targets{ includes(:targets)} ### subject{Hoge.with_targets} expect(subject.first.association(:targets).loaded?).to eq t…

【RubyOnRails】after_initializeとFactoryBot

ActiveRecordのコールバック まずは下のサイトさんをご覧ください。 qiita.com # Hoge.create()の実行順 hoge = Hoge.new(name: "hoge") #initialize after_initialize #newメソッドで生成したときのみ hoge.save! #BEGIN TRANSACTION before_validation #va…

【RSpec】ActionMailer deliver_now が呼ばれる事をテストする

やりたかった事 HogeMailerがあり、HogeDeliveryのインスタンスメソッド(send_email)内でHogeMailerを使ってメールを飛ばしていました。 私は今HogeDeliveryのモデルテストを書いていたのでsend_emailのテストを書こうとしました。しかし、ActionMailer::Bas…

【Rspec, Capybara】dt, dd要素を取得 ~ 隣の要素を取得

タイトル通りの内容です。 フィーチャーテストをする際に、dd, dtの値を関連づけて取ることでテストをわかりやすく、書きやすくしたいと思いました。 問題 <dl> <dt id="family-name" class="label">f_name</dt> <dd class="data--string">family</dd> <dt id="given-name" class="label">g_name</dt> <dd class="data--string">given</dd> <dl> 上のfamilyと言う<dd>の値をラベルf_name経由で取得したい。Capybaraであ</dd></dl></dl>…

【Capybara】vue.jsを使ったページのfeature test時に値が取れない

前提 Ruby On Railsプロジェクト内vue.jsでフロントエンドを賄っています。Capybaraでfeatueテストをする時、値がうまく取れずにコケた話です。 問題 ajaxを使い、並び順等を非同期で変更できるようなtableを持つページに対してテストを書こうとしました。し…

【mysql5.7】Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib

症状 $ bin/rails db:migrate:reset rails aborted! LoadError: dlopen(/Users/196/Documents/プロジェクト名/vendor/bundle/ruby/2.5.0/gems/mysql2-0.5.2/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.…

CarrierWave デフォルトの画像を表示する default_url

前置き 下のページで画像をアップロードする機能は実装済み 【Rails】CarrierWaveとrmagickで画像アップロード機能を作る | おすすめのプログラミングスクール比較!最短で上達するなら? 画像が保存されていない場合のデフォルトの画像を呼び出したい defau…

【Ruby On Rails】ネストとガード節

ネストがひどい 下のコードがスマートじゃない。(リダイレクトのパスとかは適当です) # hoge_controller.rb def destroy if target = User.find_by(id: params["id"]) if current_user.unfollow(target) #フォローを外すみたいな動作 flash[:info] = I18n.t(…

【RSpec】before句がdescribeスコープ外にも影響する

環境 RSpec 3.8 ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18] Rails 5.2.2 問題 ひとまずテストする内容だけ列挙して後から中身を実装していこうなんて考えることがあります。そして以下の状況になった時にひとまず走らせてみるかと思うこ…

【RubyOnRails】format.jsが呼ばれない, respond_to内のreturnについて

問題 タイトルがうまくまとめられていませんが、、 非同期による処理をwebページ上で行いたく、js経由でコントローラのupdateアクションを呼ぼうとしています。その途中でsave失敗時などに処理を中断したいなと思いたち、を下の様なコードを書きました。 # h…

form_with の label 内に<i>タグを使用する

Railsでdeviseを使用してサインアップフォームを生成し、ビューのコードをSlimで書き換える際に困りました。以下のようなform_withを用いてフォームを生成している場面 <div class="field"> <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br /> <%= f.passw</div>…

RubyOnRailsチュートリアルのテストをRSpecで書く

前書き 最近Rubyのチュートリアルをやっていたのですが、その中で紹介されているテストコードはMinitestで書かれています。今回はそれをRSpecに書き換えながら行ったので、どうせなら公開しておこうと思います。(RSpec初心者なので綺麗な書き方はできていま…

ruby チュートリアル 14章メモ

ActiveRecord through n:mの関係を表すのに使用。1:nの関係はhas_manyとbelongs_toで表した。また後者の繋ぎ方であると、直接的な結びつきになるのに対して、throughを使用する場合は、2モデル間にクッションとなるモデルを定義してそこに関係をしまってい…

ruby チュートリアル 13章 メモ

belongs_to 指定したモデルと1対1の関係を持つ。参照元テーブルから参照先テーブルにアクセスする。モデル生成時にuser:referencesをつけるとモデル内に自動生成される。 #app/models/micropost.rb class Micropost < ApplicationRecord belongs_to :user en…

rubyチュートリアル12章 メモ

隠しフィールド form_forを利用したフォーム内に隠しフィールドを設定する。 <%= form_for(@user, url: password_reset_path(params[:id])) do |f| %> <%= render 'shared/error_messages' %> <%= hidden_field_tag :email, @user.email %> <%= f.label :pas…

ruby チュートリアル11章 メモ

ActionMaier Railsに標準で組み込まれている、メールを送信してくれる機能。text形式とhtml形式のテンプレートメールを生成する事ができ、宛先や件名含めコントローラから簡単に生成する事ができる。メイラーの生成は下のコマンド。後ろの二つは追加するメソ…

ruby チュートリアル10章 メモ

form_for(@user)の判定 form_forを利用すると自動で入力フォームとそのsubmit先の設定等を設定し表示できるようにしてくれる。一般にcreateアクションとeditアクション用のフォームは同じform_for(@user)で生成される。このアクションの違いは@user内のnew_r…

【Ruby】チュートリアルのform_forをform_withで書き換え (おまけ:capybaraでのテスト)

Ruby5.1前まではフォームを生成してくれるメソッドとして、form_forとform_tagがあった。特にRubyチュートリアルでは2018/11/18現在、form_forを利用した方法を紹介しています。が、5.1以降はform_with推奨とのことなので、書き換えようと思いました。 form_…

ruby チュートリアル9章 メモ

SecureRandom.urlsafe_base64 Ruby標準ライブラリのメソッド。長さ22文字の文字列を生成してくれる。base64文字列なので64の22乘通りあるため、衝突の可能性も限りなく低い。 アクセサ インスタンス変数のゲッターとセッターのこと。rubyのクラスのインスタ…

ruby チュートリアル8章 メモ

セッションとクッキー 混同しがち(自分だけかも、)HTTPはステートレスなプロトコルなので、セッションのような物を実装するには、状態を保存するものが別に必要なる。それの一つがクッキー。クッキーはユーザのブラウザ内に保存される小さなテキスト。一方セ…

ruby チュートリアル7章 メモ

サイトにデバッグ情報表示 下のコードをレイアウトのコードに挿入することで、描画されるページの状態を把握するのに役立つ情報をサイトに表示することができる。if~文は開発環境でのみデバッグ情報を表示するよう指定している。 #app/views/layouts/applica…