- 1. Rubyのプログラムを実行するには?
- 2. 【Rails6 & Docker】yarnのバージョンが古いとエラーが出た場合にしたこと
- 3. [Rails]whereが返すのはSQLの実行結果ではなくActiveRecord::Relationのインスタンス
- 4. クレジット決済サービス(pay.jp)の実装
- 5. 【Ruby】標準入力から値を受け取る
- 6. [Rails] enumを使用したステータスの更新・連動
- 7. Slim は死なず
- 8. 【Ruby】複数データの奇数・偶数の判定の考え方
- 9. 【Rails】ActiveRecordを継承しないモデルのバリデーションはActiveModel::Modelをincludeしよう
- 10. 商品がない場合は以下のダミー商品が表示されるようにする
- 11. 【RSpec】Capybaraシステムテストで要素クリックが失敗したら確認したいこと
- 12. fixture_file_uploadメソッドを使用してテストコードを書く
- 13. ポートフォリオ作成
- 14. N+1問題をincludesメソッドで解決
- 15. ファクトリーボットにアクティブストレージを記述する。
- 16. ファクトリーボットにアクティブハッシュを設定する
- 17. Ruby実行するコマンド
- 18. Rails7にpostCSSを導入する
- 19. 【Rails】Twitterクローンを作ってみた 〜ユーザー詳細ページの作成〜
- 20. 「プロを目指す人のためのRuby入門」備忘録
Rubyのプログラムを実行するには?
Atcoderの問題を解くときに、任意の環境でコードを書く必要があったので、VScodeを開いてわざわざrails cでコンソールを開いて、1行ずつ実行していた苦い思い出があったので、共有しておきます。
rubyがインストールされた環境でターミナルを立ち上げ
rubyに何かプログラムを書いた後に
ruby 〇〇.rbと入力するとそのプログラムが実行されます。
【Rails6 & Docker】yarnのバージョンが古いとエラーが出た場合にしたこと
## Dockerでrails6の環境を構築した。
以下の記述でrails6の環境を立ち上げました
“`
# Dockerfile
FROM ruby:2.6.5RUN apt-get update && apt-get install -y sqlite3 build-essential libsqlite3-dev
RUN curl https://deb.nodesource.com/setup_18.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add –
RUN echo “deb https://dl.yarnpkg.com/debian/ stable main” | tee /etc/apt/sources.list.d/yarn.listRUN apt update && apt install -y nodejs yarn
RUN mkdir /app_name
ENV APP_ROOT /app_name
WORKDIR $APP_ROOTADD ./
[Rails]whereが返すのはSQLの実行結果ではなくActiveRecord::Relationのインスタンス
## この記事について
ActiveRecord::Relationの理解をちゃんとできておらず、debugにハマったことがあったので備忘として残すもの
※網羅的に解説しているというよりは、見落としていた所について調べたことをまとめるものです。## 参考書籍
– [パーフェクトRuby on Rails](https://gihyo.jp/book/2020/978-4-297-11462-6)
– [ActiveRecord::Relation](https://api.rubyonrails.org/v7.0/classes/ActiveRecord/Relation.html)## ActiveRecord::Relationとは
RailsのO/RマッパーであるActiveRecordにおいて定義されているクラスの一つです。
表題で「whereが〜」と書いていますが、そもそもwhereはActiveRecord::Relationで定義されているメソッドであり、実行結果としてAcitveRecord::Relationのインスタンスオブジェクトが返ってきます。今回
クレジット決済サービス(pay.jp)の実装
# はじめに
pay.jpを用いたクレジットサービスの実装手順を記録に残したいと思います。
なお、購入金額を記録に残すMVCの一連の流れは、すでに実装できているものとする。## 1.クレジット決済サービス実装の流れ
2018年6月から、APIが提供する安全な処理を利用して、クライアントサイド側でカード情報を決済サービス側に送りトークン化し、そのトークン情報をサーバーサイドに送信して決済処理を行うことが義務付けられている。
つまり、アプリケーションのサーバーサイドにおいて、クレジットカード情報を保持しないようにすることが義務付けられた。– トークンとは
セキュリティーを担保するために用いられる、一度だけ使用可能なパスワードのこと。
今回使用するトークンは、クレジットカード情報を暗号化したもの。
同じカード情報で複数回決済をしたとしても、毎回異なるトークンが発行される。– クレジット決済の流れ
①クライアントサイド側で、PAY.JPのAPIが提供する安全な処理を用いてクレジットカード情報のトークン化を行う。
②そのトークンをサーバーサイドに送信し、クレジットカード決済が行われる
【Ruby】標準入力から値を受け取る
# 数値
“`terminal:入力値
7
“`
“`rb
i = gets.to_i
p i * 10
“`
“`terminal:結果
70
“`:::note
文字列の場合、`to_i`メソッドが不要
:::# 1行に複数の入力
“`terminal:入力値
50 100 200
“`### 配列で返す場合
“`rb
arr = gets.split.map(&:to_i)
p arr
“`
“`terminal:結果
[50, 100, 200]
“`### 変数に格納する場合
“`rb
n1, n2, n3 = gets.split.map(&:to_i)
p n1
p n2
p n3
“`
“`terminal:結果
50
100
200
“`:::note
文字列の場合、`.map(&:to_i)`が不要
:::# 複数行の入力
## 数値
“`terminal:入力値
5000
3
“`### 配列で返す場合
“`rb
lines = readlines.map(&:to_i)
p lines
`
[Rails] enumを使用したステータスの更新・連動
## はじめに
今回、とあるアプリケーションの製作過程で個人的に苦戦した、enumを使用した注文ステータス、製作ステータスの更新・連動についてメモ程度にまとめました。
## 行いたいこと
– ①注文ステータスを[入金待ち]から[入金確認]へ更新した際に製作ステータスを自動的に[製作不可]から[製作待ち]に更新させる。
– ②紐付いている注文商品の製作ステータスが一つでも[製作中]になったら、注文ステータスを[製作中]に自動的に更新させる。
– ③紐付いている注文商品の製作ステータスがすべて[製作完了]になった際、注文ステータスを自動的に[発送準備中]にする。## モデルの準備
各モデルの内容は以下になります。
“`order.rb
has_many :order_details, dependent: :destroy
enum status: { payment_waiting: 0, payment_confirmation: 1, in_production: 2, preparing_delivery: 3, delivered: 4 }
#status → 注文
Slim は死なず
[Slim](https://rubygems.org/gems/slim) という Ruby 製テンプレートエンジンのお世話になっている人も少なくないと思う。私も愛用している。
GitHub リポジトリーはこちら:
https://github.com/slim-template/slim
Rails などで HTML の生成に使われることが多いと思うが,HTML のほか XML の生成にも適しており,私は SVG なんかも Slim で書いている。
# もしかしてメンテ停止?
Slim の最新版は 2020 年 5 月 8 日にリリースされた 4.1.0 で,2 年ほど新しいバージョンが出ていない。
とはいえ,Slim は私の印象では完成度が高く,2 年くらい新しいのが出てなくてもとくに不安にはならなかった。ところが,ちょっとした改善要望(後述)を issue にしようとリポジトリーを訪れて,「えっ?」と思った。
最後のコミットが 2020 年 10 月 20 日だったのだ。
新版のリリースは無くても,たいがい細かいコミットはあったりするものだ。それが 2 年ほど無い
【Ruby】複数データの奇数・偶数の判定の考え方
備忘録として自分の思考の軌跡を残しておきます。
今回の問題はこちらです。https://paiza.jp/works/mondai/loop_problems2/loop_problems2__even_output
# 考え方
## 1.奇数を数式で表す
奇数を出力するため、奇数を算出しなければなりません。
そのためまず考えることは「奇数をどのように表すか」ということです。奇数は数値nを2で割った時の余りが1になればよいので、これを数式で表します。
“`ruby
num % 2 == 1
“`Rubyでは「**%**」を使って余りを算出します。
## 2.奇数・偶数の判定方法を考える
今回求められている出力結果は「奇数のみを出力すること」だったので、この式を元に、**if**を用いた場合分けを考えていきます。
上記の式の結果がtrueになったときに出力するようにしたいので、以下のような式を作成します。“`ruby
if num % 2 == 1
puts num
end
“`## 3.標準入力でのデータ受け取り
それでは入力されたデータを受
【Rails】ActiveRecordを継承しないモデルのバリデーションはActiveModel::Modelをincludeしよう
## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16## NGパターン
Parameter層(ActiveRecordを継承しないモデル)で、独自で必須のバリデーションメソッドをつくらない。
“`ruby
module Parameters
class PostParameter
attr_reader :paramsdef initialize(params)
permitted_params(params)
validate!
enddef attributes
{
title: params[:title],
content: params[:content]
}.compact
endprivate
def validate!
if params[:title].blank?
商品がない場合は以下のダミー商品が表示されるようにする
結論
if文を使う
“`ruby
#空でなければ表示する
<% if @items[0] != nil %>#空の場合表示する
<% if @items.length == 0 %>
“`
【RSpec】Capybaraシステムテストで要素クリックが失敗したら確認したいこと
## 概要
Ruby on Railsで開発したアプリのシステムテスト実行時に、Capybaraの使い方で少し躓いた点を書いた記事です。html要素をクリック出来ずにテストが失敗した原因と解決方法を簡単にまとめました。
もし、同じ内容でテストに失敗した方のご参考になれば幸いです。
## テスト概要
– ハート文字をクリックするといいね/いいね解除できること今回開発したアプリにはいいね機能を実装しており、ハートをクリックすることでいいねといいね解除ができるようにしました。
## テスト・エラー詳細
下記コードを実行。
“`ruby
RSpec.describe ‘Comments’, type: :system do
# 投稿をいいね・いいね解除できる
it ‘user can like the post’ do
click_link ‘♡’
expect(page).to have_button ‘♥’click_link ‘♥’
expect(page).to have_button ‘♡’
end
end
“`
実
fixture_file_uploadメソッドを使用してテストコードを書く
# Formオブジェクトを導入してテストコードにエラーが出た
テストコードを打ち込む際にエラーで悩まされていたのですが、Formオブジェクトを導入すると以下のように
fixture_file_uploadメソッドを使用しないと行けないという事が分からずに時間をかけてしまいました。
以前はafterメソッドを使用してダミー画像をFactoryBotで用意していたのですが
“`ruby:FactoryBot
after(:build) do |item|
item.image.attach(io: File.open(‘public/images/test_image.png’), filename: ‘test_image.png’)
end
“`
Formオブジェクトを導入すると上記の方法ではダミー画像を使用できませんでした。# fixture_file_uploadメソッド
調べてみると下記のようにRSpecにfixture_file_upload(該当ディレクトリの画像ファイル)を使用して
インスタンス変数に代入すると良いと言うことで試してみた所無事解決しました。
ポートフォリオ作成
こんにちは!今回ポートフォリオ作成に当たってたくさん調べたので、そのurlを載せています。
ただ羅列しているだけですが、これらは正しい情報なので安心して試してください。https://www.sejuku.net/blog/47847
https://qiita.com/terufumi1122/items/ad55bf8713c0df053f58
https://hazm.jp/archives/147
https://qiita.com/Ushinji/items/522ed01c9c14b680222c
https://qiita.com/syunatsu/items/9e1f8b6ad120e8dc180b
https://qiita.com/piggydev/items/074e020e07af7ebc872d
https://abillyz.com/vclbuff/studies/501
https://qiita.com/knxrvb/items/c78c08a0a3c9
N+1問題をincludesメソッドで解決
N+1問題とは、アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなってしまう問題のこと。
“`ruby
モデル名.all
“`
としてしまうと、N+1問題にひっかかる。
それを解消するためにincludesメソッドがある。
“`ruby
モデル名.includes(:紐付くモデル名)
“`
と書けばよい。例:フリマアプリ
“`ruby
class ItemsController < ApplicationController def index @items = Item.includes(:user) end ``` で、ビューでeachメソッドを使ってインスタンスを取り出す。 ```ruby app/views/items/index.html.erb <% @items.each do |item| %>
<%= item.text %>
<%= item.name %>
<% end %>
“`
ファクトリーボットにアクティブストレージを記述する。
モデルの単体テストを行う場合、ファクトリーボットにテスト項目を載せるわけだが、アクティブストレージを使用した際にどうやってテストを行ったか書いておこうと思う。
① ![スクリーンショット 2022-10-27 13.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/67bf33d8-4c5a-137e-8395-28bdf7d66735.png)
こんな感じで、fixturesフォルダを手動で作成し、その下にfilesフォルダを作成する。
② filesフォルダに、なんでも良いのでtest_image.jpgという名前で画像を配置する。
③ Furima>specmodel>item_spec.rbに以下のように記述。
“`ruby
RSpec.describe Item, type: :model do
before do
@item = FactoryBot.build(:item)
@item.image = fixture_file_upload(
ファクトリーボットにアクティブハッシュを設定する
ファクトリーボットにアクティブハッシュを設定する場合どうしたらよいのかわからなかったので記録。
前提として、作成しているのはフリマアプリで、ユーザーモデルとアソシエーションを組んでいる。
なのでファクトリーボットにもアソシエーションの記述を忘れずに。
結論からいえば、ファクトリーボットにそのまま〜_idと書いてよいようだ。
ただし、{}の中身は1にすると—がでてしまうので、1以外で。
いつかはフェイカーをつかってもっと一般的に表せるようになりたい。“`ruby
FactoryBot.define do
factory :item do
product_name { “てすと” }
product_description {‘test’}
price {1000}
category_id {2}
condition_id {2}
contribution_id {2}
prefecture_id {2}
day_id {2}association :user
end
end
“`
Ruby実行するコマンド
ファイル名.rbで実行できないと悪戦苦闘していたが、解決。
“`
「ruby ファイル名.rb」
“`Rubyを実行する際は`ruby`というコマンドを書いてからファイル名を書かないと実行されない。
Rails7にpostCSSを導入する
# 前提
– 事前にyarnのインストールが必要
どうやら「Rails new」時に、`postcss`や、`esbuild`が「yarn」を使用してインストールされる模様
※別にnpmでいいや〜の私はこのせいで少し戸惑った?## プロジェクトの作成
“`bash
rails new . -j esbuild -c postcss
“`
– jオプションで`JavaScript`のビルダー指定
– cオプションで使用するCSSフレームワークに`postCSS`を指定色々インストールされる(適当)
### package.jsonにscriptsが登録
`yarn` + 以下のコマンドで、ビルド処理が可能。
– `yarn build` => JavaScriptのバンドル
– `yarn build:css` => CSSファイルのバンドル処理但し、Rails7には`bin/dev`コマンドが用意されているため、こちらを使用するのが一般的。
(CSS,JSの変更を検知して、自動でビルド処理してくれる優れもの)`gem “jsbundling-rails”` と `
【Rails】Twitterクローンを作ってみた 〜ユーザー詳細ページの作成〜
## はじめに
[【Rails】Twitterクローンを作ってみた 〜ログイン周り編〜](https://qiita.com/bloom__fu/items/d005686cbdaa83d2c0c2)の続きです。ログイン周り編を前提に進めていきますので、まだご覧になっていない方はそちらからご覧ください!※こちらはdockerでの環境構築を省きます。
## サービス環境
– ruby 3.0.0
– Rails 6.0.4
– docker
– mysql 8.0.2
– Slim, SCSS## ユーザー詳細ページの作成
#### 条件
– トップページの「つぶやく」の上にある自分の名前をクリックするとユーザー詳細ページに飛ぶ
– 自分のプロフィールを編集できる
– 退会ボタンから退会することができる
ユーザーのプロフィールの内訳は名前、自己紹介文、プロフィール画像とします。プロフィール画像に関しては後のセクションでやるのでまだこのセクションでは編集できなくて良いです。ユーザー退会はユーザーを実際に削除するのではなく論理削除してください。
#### 実装流れ(簡略)
① Userモ
「プロを目指す人のためのRuby入門」備忘録
# 概要
プロを目指す人のためのRuby入門を読み、知識を定着させたいと思い、アウトプットさせて頂きます。## ブロックを使用したメソッドの書き方
記事などを読み、今までは一体何の処理をしているのかわからなかった記述も、この書籍でRubyの深い部分を学ぶことで、理解につながることが多々ありました。“`ruby:ruby
[‘ruby’, ‘java’, ‘python’].map { |s| s.upcase } #=> [“RUBY”, “JAVA”, “PYTHON”]
# 上記一文の書き換え
[‘ruby’, ‘java’, ‘python’].map(&:upcase) #=> [“RUBY”, “JAVA”, “PYTHON”][1, 2, 3, 4, 5, 6].select { |n| n.odd? } #=> [1, 3, 5]
# 上記一文の書き換え
[1, 2, 3, 4, 5, 6].select(&:odd?) #=> [1, 3, 5]
“`
こちらでは、mapメソッドやselectメソッドにブロックを渡す代わりに、