微炭酸ログ

Ruby や Rails を中心に。

【Rails】アプリケーション作成手順

mkdir app-name && cd $_ rbenv local 3.0.3 ls -a . .. .ruby-version ruby -v ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-darwin19] gem search ^rails$ -l *** LOCAL GEMS *** (※何もなかった) gem i -v 6.1.4.1 rails gem search ^rails$…

【Rails】CarrierWave で画像の縦横の大きさの値をバリデーションする

ファイルサイズのバリデーション(10MBまで可、みたいな)は CarrierWave の中に組み込まれていますが、縦横の大きさについてバリデーションする機能は現状ありません(ActiveStorage なら簡単にできるらしいですね)。 今回はその「CarrierWave で縦横の大…

【Rails】フォーム内でプレビューボタンを一緒に作るときは、data: { disable_with: false } も使う

formaction を使ってプレビュー機能を実装したりすると思いますが、だいたい formtarget: '_blank' も一緒に使うと思います。 formtarget: '_blank' を使うと、プレビューは別タブで表示されます。 また元のタブに戻ってフォームを送信する、という操作を期…

【Rails】ActiveRecord で属性名に ?(はてな)をつけると true / falseを返すけど、使う際は boolean の属性に限定したほうがいい

※どちらかというと自分への備忘記事になります。 タイトルのままですが、以下のような場合に、 create_table "books", force: :cascade do |t| t.string "title" t.integer "price" t.boolean "published" # ... end 以下のようになります。 [2] pry(main)> …

【Rails】「このメソッド、呼べるなら呼んでくれ」と書くなら respond_to? よりも try を使う

行けたら行く的な。 結論 @person.non_existing_method if @person.respond_to?(:non_existing_method) # => nil は、 @person.try(:non_existing_method) # => nil と同じだと、https://api.rubyonrails.org/classes/Object.html#method-i-try にありました…

【Rails】length, size, count, empty?, exists? などの使い分け

length() https://api.rubyonrails.org/v6.1.3.2/classes/ActiveRecord/Associations/CollectionProxy.html#method-i-length コレクションがすでにロードされている場合、length と size は同等です。そうでない場合で、とにかくレコードが必要になる場合、…

【RSpec, vcr】1つの example の中で同じURLへのHTTPリクエストを複数回実行する場合は、allow_playback_repeats を使う

vcr を使っていて、1つの example の中で同じURLへのHTTPリクエストを複数回実行しようとすると、エラーになります。 そういうときは、allow_playback_repeats オプションを使用します。 it 'xxxx' do VCR.use_cassette 'xxxx', allow_playback_repeats: tru…

Stimulus を学ぶ

Stimulus Handbook を読んだので、かいつまみました。 コードは Handbook のものを載せています(一部改変しています)。 コントローラを用意する どのコントローラも以下のように定義する。 ファイル名は規約に従ったものにしておく(xxxx_controller.js)…

【Bootstrap5】入力フィールドとボタンを横に並べる

以下のように書くといいのか...? .d-flex %input.form-control.w-auto{ type: :text } %button.btn.btn-secondary.ms-2 Greet 公式を参考に以下のように書いてみたが、これだとスマホ表示の時に横に並ばない。 参考:https://getbootstrap.jp/docs/5.0/form…

Railsアプリに Stimulus を導入する

1. yarn add $ yarn add stimulus 2. app/javascript/controllers/index.js import { Application } from 'stimulus' import { definitionsFromContext } from 'stimulus/webpack-helpers' const application = Application.start() const context = require…

Turbo Streams を学ぶ

基本 以下のように Turbo Streams なレスポンスを返すと、指定した id(この例だと id="messages") の要素に対してストリームアクション(この例だと prepend)できます。 指定したDOMだけに変更を加えることができるので、よりSPAっぽくなります。 ストリ…

【Rails】パーシャルにフラグを渡す際は先頭で遅延初期化させるといい

以下のように書いておけば、フラグ == false のときに、呼び出し側でフラグを渡さなくてよくなる。 - special ||= false - if special # ... - else # ... つまり、以下のように書く必要がなくなる。 render 'xxxx', special: false false のときは変数を渡…

【Rails】ActiveRecord の where で Range を使う

Range でない書き方と並べて書くことで、覚えやすくしています。 beginless, endless の less の部分(..の端)に指定したカラムの値が来るイメージでしょうか。 でも結局、毎回 rails console で確認するのがよさそうではあります。 以下 Book.where('relea…

【RSpec】入力フィールドやボタンが非活性になっているか検証する

入力フィールドやボタンに disabled 属性がついているかを検証するには、以下のように書きます。 it 'フォームに入力できないこと' do # ... expect(page).to have_field '名前', disabled: true expect(page).to have_button '登録する', disabled: true en…

【RSpec】travel_to を使うためのセットアップ

spec/rails_helper.rb に以下のように1行追加すれば、travel_to を使えるようになります。 RSpec.configure do |config| # ... # 追加 config.include ActiveSupport::Testing::TimeHelpers end 参考 RSpecで現在時刻を変更してテストしたいときはtravel_to…

Turbo Frames を学ぶ

前提 Rails で、turbo-rails を使用しています。 最も基本的な動き 編集ボタンを押すと、turbo_frame_tag 'edit_room' の部分が、edit.html.haml の turbo_frame_tag 'edit_room' の部分で置き換わります。 ↓app/views/rooms/show.html.haml = turbo_frame_t…

【Rails】Bootstrap5 を導入する

$ yarn add bootstrap @popperjs/core ↓app/javascript/packs/application.js import 'bootstrap' import 'stylesheets/application' ↓app/javascript/stylesheets/application.scss @import '~bootstrap/scss/bootstrap'; 参考 Webpack と Bundler · Bootst…

lsb_releaseをインストールする

y_tsubasa@5ecbd666457b:~$ lsb_release -a bash: lsb_release: command not found y_tsubasa@5ecbd666457b:~$ sudo apt install lsb-release [sudo] password for y_tsubasa: Reading package lists... Done Building dependency tree Reading state inform…

RMagick が bundle install でスッと入らなかったので

事象 (gem 'rmagick' を記述してから) $ bundle install The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32…

rails g mailer で何が生成されるか

生成ファイルをメモします。 $ rails g mailer NoticeMailer sendmail_confirmRunning via Spring preloader in process 946 create app/mailers/notice_mailer.rb invoke haml create app/views/notice_mailer_mailer create app/views/layouts/mailer.text…

【Rails】rails g controller のときにビューファイルもビューフォルダも生成させないようにする

経緯 リソースのCRUDはしたいのでコントローラーは欲しいけど、ビューファイルは不要なとき、例えば記事にコメント機能を実装する場合、コメントだけの作成画面は要らないですよね。記事リソースの詳細画面内でコメント投稿できるようにしたい、みたいな。 …

ブラウザからのリクエストもsshコマンドもConnection refusedのエラーとなってマジやばかった件

前提 環境は以下の通りでした。 VPS:ConoHa VPS OS:CentOS Webサーバ:Nginx アプリケーションサーバ:Unicorn デプロイ:Capistrano Webアプリ:Ruby on Rails 事象 ソース修正もデータ投入もしていなかったのに、突然リクエストが繋がらなくなりました。…

modelだけ作成済みの状態でrails g scaffold xxxxを叩くとどうなるか

あらかじめ下記2つのコマンドを叩いてあります。$ rails g model blog title:string$ rails db:migrate ※Haml導入済みです※途中Overwriteするかを尋ねられたので、nでリターンキーを押しました $ rails g scaffold blog title:string Running via Spring pre…

rails generate scaffold_controller xxxx を叩くと何が生成されるか

せっかく叩いたので何が生成されるのかメモしておこうということで。 ※Haml導入済みです $ rails generate scaffold_controller blogRunning via Spring preloader in process 978 create app/controllers/blogs_controller.rb invoke haml create app/views…

【Rails】ログイン機能はGET/POSTともに同じURLにアクセスするようにする

構築中のアプリケーションにはログイン機能を実装してあるのですが、routes.rbには以下のように記述していました。 get 'login' => 'login#index'post 'login/auth' これでもログインページが表示できてログイン自体も成功しますし、間違った値をしっかり弾…

【Ruby】複数キーの降順ソート

試合結果から順位表を自動生成する機能を作りました。 とりあえず勝ち点をキーにしてソートすれば順位は出せます。 が、要件の都合上、勝ち点が並んだ場合に順位決定戦が別途あり、その勝敗は勝ち点に影響せず、順位表示だけに影響します。 つまり、 1位 XX…

VirtualBox上のUbuntuにSSH接続する

詰まったところをまとめていく感じで書きます。 (手順全てを書いていくというかは、引用先に飛んでもらいながらになります。他の方が書いたものをそのまま書くのは云々ということで) ①ポートフォワーディングを設定 下記リンク先を参照 tenten0213.hatenab…

【Bitbucket】プルリクエストのマージ戦略(マージコミットはgit merge --no-ff)

昨日はBitbucketでのプルリクエストとマージをやってみたのですが、 今日はマージ戦略の画面をブログに書いておこうと思いました。 Bitbucketのプルリクエストのマージ チームによると思いますが、トピックブランチでの作業履歴がしっかり残るという点で(今…

【Git】GitHub Flow 簡単なまとめ

・(ローカル)トピックブランチ作成 $ git checkout -b readme-update ・(ローカル→リモート)リモートトピックブランチ作成 $ git push -u origin readme-update ・ソース修正&コミット&プッシュ →IDEで操作 ・プルリクエスト作成 →Bitbucket内で操作 …

【Rails】コントローラとビューを同時に生成する

アホみたいに忘れるので備忘更新です。 下記ページと内容が同じになります。 code-schools.com $ rails g controller award show Running via Spring preloader in process 1348 create app/controllers/award_controller.rb route get 'award/show' invoke …