- 1. Rails RSpecテストを導入しよう!
- 2. Rubyスクリプトにもmainメソッドを定義するといいかも、という話
- 3. 【M1チップ】Homebrew経由でのRubyインストールに苦戦した
- 4. DBのトランザクションがコミットされる前に非同期ジョブを実行してしまっていた、、、
- 5. Railsのpresent?メソッドの使い方
- 6. ActionMailerを使用した問い合わせ機能の実装
- 7. 特定のディレクトリ内のファイルを一括でrequireした話
- 8. 【Rails】Rails5.2 リッチテキストエディタsummernote-railsのツールバーアイコンの表示・非表示を切り替える
- 9. Railsで並び替え機能を実装する
- 10. listen tcp 0.0.0.0:xxx: bind: address already in us の対処法
- 11. 【jQuery】Ajaxで追加した要素へ正しくイベントセットする方法
- 12. RailsにおけるSQLインジェクション対策について – Rails Tutorial リスト13.46
- 13. Dockerのruby:2.7-alpineでruby2.7がないといわれてしまう
- 14. Rubyの継承関係をまとめてみた(投稿テスト)
- 15. 2点間の距離検索をgeokit-railsからelasticsearchに切り替えのため、検索手法を調査した
- 16. bundle exec
- 17. 【Ruby】ハッシュの生成
- 18. Rspecでテストを作成する時、各ファイル毎に require ‘rails_helper’ と書くのを省略する
- 19. attr_accessor(アクセサ)の使い方(Ruby初心者)
- 20. 【Rails】js.erb で文字列の途中で改行する方法
Rails RSpecテストを導入しよう!
#経緯
Railsチュートリアルなどではminitestが使われているが
実際の現場ではRSpecを用いたテストを行っているため
今回はRailsにRSpecを導入するまでの手順を乗せていこうと思います。#利用するテスト用ライブラリ
1 RSpec
2 Capybara
3 FactoryBot
# RSpecのインストールと初期準備“`Gemfile
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console
gem ‘rspec-rails’, ‘~>3.7’
end
“`
次に以下のgenereteコマンドを実行します。“`ターミナル
bundle
bin/rails g rspec:install
=>Running via Spring preloader in process 4359
create .rspec
create spec
create
Rubyスクリプトにもmainメソッドを定義するといいかも、という話
## はじめに
Ruby(Railsではない、単純なRubyスクリプト)では、以下のようにトップレベルで変数を宣言したり、様々な処理を記述したりすることができます。“`ruby
require ‘date’def play
puts ‘あそぶよー’
enddef study
puts ‘勉強するよー’
end# トップレベルで変数宣言
today = Date.today# トップレベルで条件分岐とメソッド呼び出し
if today.sunday?
play
else
study
end
“`## 上のコードの問題点
もちろんこれでもよいと言えばよいのですが、以下のような問題点もあります。
### コードリーディング時に下から上に進まないといけない
プログラムとしてのロジックが開始されるのは `today = Date.today` の行からですが、プログラムの構造上、どうしてもメソッド定義(`def play`や`def study`)の方を先に書かざるを得なくなります。
よって、コードリーディング時(またはコードレビュー時)は先に
【M1チップ】Homebrew経由でのRubyインストールに苦戦した
# 概要
プログラミング勉強真っ只中の私ですが、先日M1チップ搭載のMacbook Proを購入しました。
そこでRuby on Railsの環境構築をしようとしたところ苦戦しましたが、初心者の私でもなんとか出来たのでやったことを残しておきます。
~~(最初はHomebrewって何?美味しいの?ってレベルでした)~~参考にさせていただいた記事
https://qiita.com/aiorange19/items/5ffaefc85f912f60c2fa# 動作環境
・Macbook Pro (13-inch, M1, 2020)
・macOS Big Sur (ver11.0.1)Xcodeをインストールして無い人は予めインストールしておくと幸せになれるかもしれません。
(App StoreからDL出来ます)
容量約12GBなのでめっちゃ時間かかった。# Homebrewのインストール
Homebrewをインストールします。
https://brew.sh/index_ja公式ドキュメントにも記載があるように、M1チップのMacでは「/opt/homeb
DBのトランザクションがコミットされる前に非同期ジョブを実行してしまっていた、、、
### はじめに
DBの更新処理が完了したら、非同期ジョブを実行するようにしていたが、更新前の状態で非同期ジョブが実行されていた、、
ここでは例として、下記要件があるとする
– メッセージが送られたら、ユーザーアプリへ非同期ジョブにてプッシュ通知を送る
– 全てのメッセージ送信に対して、ログテーブルで履歴を残す
– 特定のメッセージの送信が完了したら、ポイントがつく### 動作環境
– ActiveJob
– Sidekiq
– Redis### 更新処理の実装
“`ruby
class Message < ApplicationRecord enum status: { prepare: 0, # 下書き complete: 1 # 送信完了 } def complete_message! transaction do complete! update_message_log! # メッセージログテーブルを更新する処理 end MessagePushJob.perform_later(s
Railsのpresent?メソッドの使い方
##present?メソッドとは
オブジェクトであるレシーバーの値が存在すればtrue、存在しなければfalseを返すメソッドです。条件分岐(if文等)をプログラムで書くときによく使います。例えばアプリの購入機能において「もし選択した商品に紐づく購入記録が存在していたら(空ではなかったら)、”sold out”と表示する」を実装したい場合は該当のビューファイルにおいて
“`:index.html.erb
<% if item.purchase.present? %>
Sold Out!!<% end %>
“`という様に記述します。
“<% if item.purchase.present? %>“の部分ですが
itemモデルとpurchaseモデルにテーブル間のアソシエーションが組んであれば
“商品(item)に紐づく購入記録(purchase)が存在していたら(空ではなかったら)=true“
という解釈になります。以下のサイトにはpresent?メソッドと逆のbla
ActionMailerを使用した問い合わせ機能の実装
#実装機能
問い合わせフォームからメールを送信、それを指定したメールアドレスで受信する。
(アプリの利用者から管理者に向けてのメール機能として実装)ActionMailerでは他にもメルマガ配信のように運営側からユーザーに対してメール送信を行ったり、問い合わせに対するメールの返信機能なども実装が可能とのことだが、今回は一番シンプルなこちらの機能を実装。
またGmailアカウントでのメールの受信方法の為、前提としてGmailのアカウントを持っている体で話を進めていく。##**完成イメージ**
![スクリーンショット 2021-01-24 18.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936377/cbdf89fd-9cbb-aa56-9722-7a8d59f6bfdb.png)
#実装内容
##1.コントローラの作成
使用するビューファイルはnewのみな上にルーティングの修正が面倒な為、アクションの指定はせずにコントローラファイル単体で作成。“`
$ rails g c
特定のディレクトリ内のファイルを一括でrequireした話
# 元々の状況・課題
Rubyで[チケット料金モデリング](https://github.com/j5ik2o/ticket-price-modeling)に挑戦中。
特定のディレクトリ内のファイルを一つずつrequireするのが面倒。
今後特定ディレクトリ内にファイルが増えた際に、追加するのも面倒。# やったこと
下記コードを読み込みする側(User.rb)の一番上に書くことで、特定のディレクトリ内のコードを一括でrequireできました。“`Ruby
Dir[File.expand_path(“../user_type”, __FILE__) << "/*.rb"].each do |file| require file end ``` ## ディレクトリ構成は、ざっくりですがこんな感じです。 ``` ├── sample │ ├── user.rb ←読み込みする側(requireする側) │ └── user_type │ ├── user_a.rb ←requireしたいファイル │ └── user_b.rb ←requir
【Rails】Rails5.2 リッチテキストエディタsummernote-railsのツールバーアイコンの表示・非表示を切り替える
gem ‘summernote-rails’
https://github.com/summernote/summernote-rails“`summernote-init.coffee
$(document).on ‘turbolinks:load’, ->
$(‘[data-provider=”summernote”]’).each ->
$(this).summernote
lang: ‘ja-JP’
height: 300
toolbar: [
[‘insert’, [‘picture’, ‘link’]],
[“table”, [“table”]],
[“style”, [“style”]],
[“fontsize”, [“fontsize”]],
[“color”, [“color”]],
[“style”, [“bold”, “i
Railsで並び替え機能を実装する
##自己紹介
初めてQiitaに記事を投稿します。
9月から独学でプログラミング学習を開始し、
11月からスクールを使って学習しています。
現在はポートフォリオの作成中です。
知識を定着させるために、学びをアウトプットします。
また、これから学び始める方の参考になることを願っています。
***
##開発環境
– Ruby 3.0
– Ruby on Rails 6.0.3.4#並び替え機能を実装する
現在、映画情報を保存するための“`Movie“`というテーブルがあるとします。
まずは“`Movie“`モデルを編集します。“`rb
class Movie < ApplicationRecord scope :sort_movies, -> (sort) { order(sort[:sort]) }
scope :sort_list, -> {
{
“並び替え” => “”,
“作成の古い順” => “updated_at ASC”
“作成の新しい順” => “updated_at DESC”
}
}
listen tcp 0.0.0.0:xxx: bind: address already in us の対処法
##目的
Ruby on Railsでポートフォリオを作成していた途中にdocker-compose upをした際に、listen tcp 0.0.0.0:xxx: bind: address already in usとエラーが出たのでその時の対処方法を忘れないように書きます。##エラー内容
“`
$ docker-compose up -d
————————-
————————-
Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use
ERROR: Encountered errors while bringing up the project.
“`##対処方法
最初にこのコマンドを打ちます。“`
$ sudo lsof -i -P | grep “LISTEN”name1 633 ~~~~~~ 10u IPv4 0xc46fc7
【jQuery】Ajaxで追加した要素へ正しくイベントセットする方法
#概要
自作ポートフォリオの買い物メモアプリで、Ajaxを用いてメモの投稿機能を非同期処理に書き換えたところ、bootstrap4(modal) & jQueryで実装していた、投稿に対するコメント投稿機能が動かなくなる不具合が発生しハマったため、備忘録のために投稿しました。#結論
私の場合、modalに値を渡す処理を書いていたjQueryのコードを修正したことで改善出来ました。
Ajaxで実装した動的な要素(投稿)に対して、適切なイベントセットが出来ていなかったことが原因です。“`ruby:app/assets/javascripts/comment_modal.js
変更前
$(“.js_comment_btn”).on(“click”,function() {
$(“#comment_id”).val(this.value);
});変更後
$(document).on(“click”,”.js_count_btn”,function() {
$(“#comment_id”).val(this.value);
});“`
“`app/views/notes
RailsにおけるSQLインジェクション対策について – Rails Tutorial リスト13.46
## はじめに
Rails Tutorialを進めていく中で気になったところを記事にして残してます。記事に間違いがある場合は教えてください:grin:
## 用語解説
### SQLインジェクションとは
> SQLインジェクションは、Webアプリケーションのパラメータを操作してデータベースクエリに影響を与えることを目的とした攻撃手法です。SQLインジェクションは、認証をバイパスする目的でよく使われます。他にも、データを操作したり任意のデータを読み出したりする目的にも使われます。
> [Rails セキュリティガイド – Railsガイド](https://railsguides.jp/security.html#sql%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)
つまり、ログインフォームや投稿フォームなどでSQLのデータを処理する際に、不正**(サーバーからみると正常)**なデータが実行されてしまうことです。
これによってログイン偽装やデータの抜き取りが起こります。#
Dockerのruby:2.7-alpineでruby2.7がないといわれてしまう
# はじめに
これまでいくつかのDockerimageを構築してきました。OpenAPIとSinatraの組み合わせは、お手軽なのですが、これまで作成してきたイメージを作り直したところ問題が発生しました。
Dockerでbundle exec rackup …を実行したタイミングでエラーメッセージが表示されてしまうようになりました。
“`bash:エラーメッセージ
$ sudo docker run -it –rm \
–env LC_CTYPE=ja_JP.UTF-8 \
–env RACK_ENV=”deployment” \
-p 8080:8080 \
–name webapp mywebapp \
…
+ bundle exec rackup –host 0.0.0.0 –port 8080
env: can’t execute ‘ruby2.7’: No such file or directory
“`コンテナ内のファイルを確認して、最後のメッセージは ./lib/ruby
Rubyの継承関係をまとめてみた(投稿テスト)
## はじめに。
Rubyの継承関係を、Github pagesでマークダウンを書く練習がてらまとめてみたのですが、動作確認で上げたページの閲覧が意外とあったので、慌ててちゃんとしたページにしました;;(∩´~`∩);;
(ほんと今週末試験なのに何やってるんだろう、こやつは?)
[継承関係まとめ](https://azariah-kuma.github.io/Ruby_ancestors/)
きっと私なんぞより上手くまとめたページは山ほどある。間違いない。(余談)先生が言っていた、「特異クラスは”singleton class”(1枚札)より相応しい呼び方があるんだけど、何だったかなぁ?」の答えはきっと
“eigenclass”(固有の)だろうな( ˊᵕˋ 😉以下、Github pagesと同文ですのでご承知おきくださいませ。
## Rubyの継承関係で知っておくべきこと
– silverの範囲
– **すべてのクラスは、Classクラスから継承されている。**
– Classクラス(トップレベル)は、生成機能をもっている。
– スーパークラスを明示せずクラス
2点間の距離検索をgeokit-railsからelasticsearchに切り替えのため、検索手法を調査した
### はじめに
Railsで緯度経度の2点間の距離を検索するために、geokit-railsを使っていたが、全ての検索をelasticsearchにしたいので、検索手法を調査した
### geokit-railsによる距離検索
geokit-railsによる距離検索はsphere_distance_sqlとflat_distance_sqlの2種類ある
“`ruby
def distance_sql(origin, units=default_units, formula=default_formula)
case formula
when :sphere
sql = sphere_distance_sql(origin, units)
when :flat
sql = flat_distance_sql(origin, units)
end
sql
end
“`https://github.com/geokit/geokit-rails/blob/cc5fd43ab4e69878fb31ebd1fc22918e2952b560/l
bundle exec
#bundle exec をつける時
bundle execをつけずにrailsコマンドを叩くと、デフォルトのrailsが動く
bundle execをつけると、そのプロジェクトで管理している(rbenvなどのバージョンを管理してくれるもの)rails が動くbundlerとは
そのプロジェクトのgemを管理しているよ
bundle install をするとgemfileの中身が読み込まれる参考:https://qiita.com/d0ne1s/items/fa2dafcee02e963fe997
【Ruby】ハッシュの生成
ハッシュの記述方法がよくわからなくなってしまうので、復習を兼ねて記事にしました。
#ハッシュとは
データ」とそれに対応する「名前」のセットを要素として持つ値。
ハッシュにおいては、データをバリュー、それに対応する名前をキーと呼ぶ。#ハッシュの生成方法
**文字列**をキーにする場合と**シンボル**をキーにする場合がある。
シンボルをキーにすると、キーを数値として扱ってくれるので処理速度が早い。
##文字列をキーにした書き方
“`ruby
height1 = { “Taro” => 175 , “Jiro” => 170 , “Kohei” => 165}
“`##シンボルをキーにした書き方
以下どちらの記述でもOK“`ruby
height2 = { :Taro => 175 , :Jiro => 170 , :Kohei => 165}
height3 = { Taro: 175 , Jiro: 170 , Kohei: 165}
“`#ハッシュを編集するとき(値の追加、変更)
##ハッシュに値を追加する場合
ハッシュに値を追加したいときは以下のように記述
Rspecでテストを作成する時、各ファイル毎に require ‘rails_helper’ と書くのを省略する
## 環境
Mac OS X
Ruby: 2.7.1
Rails: 6.0.3.4## 課題
RSpecでテストを作成する時、何も設定しないと以下のように記述すると思う“`ruby:model_spec.rb
require ‘rails_helper’
Rspec.describe Model, type: :model do~以下テスト~
“`
しかしrequire ‘rails_helper’と毎回記述するのは面倒くさいので省略できないか調査した## 解決法
.rspecに以下のコードを追加する“`ruby:.rspec
–require rails_helper
“`## 結果
以下のようにしてもテストが動き、コードを削減することができた“`ruby:model_spec.rb
Rspec.describe Model, type: :model do~以下テスト~
“`## 参考記事
https://qiita.com/yuta-ushijima/items/ffb34823b8bba2180c94## 最後に
お読み
attr_accessor(アクセサ)の使い方(Ruby初心者)
#アクセサとは
定義:インスタンス変数にアクセスするために必要なもの。前提:Rubyではそのままだとインスタンス変数にアクセスできない。
→外部からの変数書き換え、呼び出しができない。“`ruby
class User
@name = “”
enduser = User.new
user.name = “taro”
p user.name#=>rb:6:in `’: undefined method `name=’ for # (NoMethodError)
“`
→インスタンス変数からの呼び出しを可能にするのがattr_reader(ゲッター)
“`ruby
class Human
attr_reader :name #(ゲッター)
def initialize(name)
@name = name
end
endhuman = Human.new(“taro”)
puts human.name
“`
実行結果“`
taro
“`→インスタンス変数を外部から書き換え可能にするのが
【Rails】js.erb で文字列の途中で改行する方法
# 背景
JSにRubyを埋め込みしていたのですが、長ったらしくなってしまったので、途中で改行したくなりました。# 方法
行の最後に「\」をつける。“`javascript
document.getElementById(‘messages’).insertAdjacentHTML(‘afterbegin’,
‘
関連する記事
OTHERカテゴリの最新記事
-
- 2024.09.19
JavaScript関連のことを調べてみた
-
- 2024.09.19
JAVA関連のことを調べてみた
-
- 2024.09.19
iOS関連のことを調べてみた
-
- 2024.09.19
Rails関連のことを調べてみた
-
- 2024.09.19
Lambda関連のことを調べてみた
-
- 2024.09.19
Python関連のことを調べてみた