- 1. cancancanのテストをRSpecで書く
- 2. Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化(Rails)
- 3. rails6 Bootstrapテンプレートでのエラー
- 4. 【Ruby】each_charメソッドについて
- 5. annotate_modelsを導入したのにアノテーションが動かなかった
- 6. rspecの導入手順 json コントローラテスト
- 7. バージョン指定で”rails new”したら”Gem::GemNotFoundException”でコケたとき用
- 8. Rubyにおけるインスタンスメソッドとクラスメソッドの違い
- 9. Rubyにおけるprivateメソッド
- 10. find_or_initialize_byとfind_or_create_byについて
- 11. 本日の基礎練習問題(22/3/17)
- 12. rails db:reset コマンドの挙動について
- 13. herokuにあげた後にエラー発生
- 14. 【Ruby on Rails】Skipprでスライドショー【Rails6】
- 15. 【Ruby】指定日付内のランダムな日時を取得する
- 16. 【Rails】ラジオボタンのラベルにクリック判定をつける
- 17. 【初心者用】RubyでCSVファイルを出力してみた
- 18. 【初心者】ルートのルーティング設定
- 19. Rubyで複数の配列を比較して重複の値を取り出したり、排除したりする方法
- 20. 【Ruby】配列の中の配列とか、ハッシュの中のハッシュとか、モヤモヤするのでモデル化したら「シン・オブジェクト」が第4形態に進化した!【オブジェクトマッパー編】
cancancanのテストをRSpecで書く
cancancanを使った際、テストに学びがあったので投稿します。
# 前提:cancancanとは
権限による制御が簡単にできるgemです。
– [cancancan](https://github.com/CanCanCommunity/cancancan)
– [Rails|CanCanCanの使い方解説](https://weseek.co.jp/tech/1211/)
↓私も1つ記事を書きました。
– [cancancanでモデル名に紐づかない制御をする方法](https://qiita.com/m-ito27/items/784f22bec151cc2f1e28)# cancancanのテスト
requestスペックなどで特定の権限が各アクションを実行できるかどうかをテストする方法もあると思いますが、今回はcancancanが用意しているmatcherを使ってテストする方法を紹介します。– 参考
https://github.com/CanCanCommunity/cancancan/blob/develop/docs/testing.md“`ruby:a
Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化(Rails)
Deviseを使っていたRailsアプリケーションで、ログイン情報としてIDとパスワードとは別に、**特定の条件をユーザーが満たす場合にそのユーザーのログインを許可したくない**場面があり、その際の制御と日本語表示を学んだので備忘として記載します。
# やりたいこと
ユーザーはメールとパスワードでログイン可否の認証を行なっている。
しかしながら、ユーザーテーブルにはロック状態かどうかを判定するカラムがあり、ユーザーがロックされている場合にはログインさせたくない。
また、エラーメッセージを日本語化したい。## 1. ユーザーにログインさせない方法
結論:Deviseが用意している[`active_for_authentication?`メソッド](https://github.com/heartcombo/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in) を使う
“`ruby:user.rb
def active_for_authentication?
super &
rails6 Bootstrapテンプレートでのエラー
こちらは、私がBootstrapのテンプレートを使用した時につまづいたエラーについて紹介します。
# 環境
ruby 3.0.2
rails 6.1.4
bootstrap 5.0.0-beta3
popperjs 2.10.2
webpacker 5.0# エラー内容
bootstrpのテンプレートをインストールし、ダウンロードしたフォルダやファイルを自分のアプリに組み込んでいきます。
その時に、stylesheetsフォルダーに必要なcssやscssのファイルも一緒に移行しました。
そして、ローカルにアクセスして見たところ、
“`
Sprockets::DoubleLinkError
“`
こちらは、「同じ出力パスを持つ複数のファイルをリンクできない」というエラーのようでした。# つまづいたポイント
Rails6からwebpackerがデフォルトでインストールされるようになりました。
webpackerでは、cssファイルではなくscssファイルを使用することでスタイルの編集が可能になります。
なので、stylesheetsフォルダー中にcssファイルかscssファイ
【Ruby】each_charメソッドについて
## each_charメソッドについて
“`ruby
“hello世界”.each_char {|c| print c, ‘ ‘ }
“`
“`
h e l l o 世 界
“`
このように表示されるらしい。### 参考
https://docs.ruby-lang.org/ja/latest/method/String/i/each_char.html
annotate_modelsを導入したのにアノテーションが動かなかった
# 環境
Ruby 3.0.2
Rails 7.0.2.3# Annotate models
モデルファイルなどに、↓のようなマイグレーションの内容を自動で書いてくれるツール
“`ruby
# == Schema Info
#
# Table name: line_items
#
# id :integer(11) not null, primary key
# quantity :integer(11) not null
# product_id :integer(11) not null
# unit_price :float
# order_id :integer(11)
#class LineItem < ActiveRecord::Base belongs_to :product . . . ``` [ここ](https://github.com/ctran/annotate_models#install)を参考
rspecの導入手順 json コントローラテスト
## 序文
RSpecを初めて使ってみましたので手順を残します。
## Gemfileにrspecを入れましょう
“`
group :development do
gem ‘rspec-rails’
end“`
## specファイルを作りましょう
“`
rails g rspec:controller the_dog“`
## テスト環境設定
テスト環境の設定ができているか見直しましょう
例)
– config/database.ymlにテスト用のDBを指定
– config/test.yml.encの追加
– config/settings/test.yml
– rails db:environment:set RAILS_ENV=test“`
require ‘rails_helper’RSpec.describe Api::V1::TheDogController do # コントローラ名
render_views
describe “GET /index” do
it do
request.env[“
バージョン指定で”rails new”したら”Gem::GemNotFoundException”でコケたとき用
# そもそも
– 現場Railsの3章、”taskleaf”アプリケーションの準備段階で躓く(バージョン指定でnewが出来ず)
– バージョン指定での”rails new”以外の方法があるっぽいので実践してみたログ# 手順
#### アプリのディレクトリを作成する
“`
mkdir hoge
“`#### ディレクトリに移動
“`
cd hoge
“`#### bundle initする
– (これ要るのか?要調査)
“`
bundle init
“`#### できたGemfileにRailsのバージョンを書き込む
“`rb:Gemfile
gem “rails”, ‘5.2.1’
“`#### bundle installする
“`
bundle install
“`#### Rails new(質問にはYで答える)
“`
$ rails _5.2.1_ new . -d postgresql –skip-bundle
“`#### Gemfileのsass-railsのバージョン指定を外す
– 次にbundle installす
Rubyにおけるインスタンスメソッドとクラスメソッドの違い
用語の違いは以下になります。
“`ruby:qiita.rb
class User
# これがインスタンスメソッド
def hello
p “hello”
end# これがクラスメソッド
def self.hello
p “hello”
end
end
“`selfが付くやつがクラスメソッド。完
Rubyにおけるprivateメソッド
privateメソッドについて全くわからなかったので簡易的にまとめました。
以下の場合、クラスの外から呼び出しているのでエラーになる。
“`ruby:sample.rb
class User
privatedef hello
puts ” ハローワールド”
end
enduser = User.new
user.hello
“`
つまり作成したインスタンスからは呼び出せないのです。ということで、次のようにクラス内で、privateメソッドを呼び出すメソッドをあらたに定義する。
そして新たに定義したメソッドを実行。“`ruby:sample2.rb
class User
def say
hello
endprivate
def hello
puts ” ハローワールド”
end
enduser = User.new
user.say
“`
つまり、privateではないメソッドを一枚挟んだらいいということでした。完
find_or_initialize_byとfind_or_create_byについて
## 2つのメソッドの違い
Railsを勉強していく中でこの2つのメソッドに遭遇したのでそれのアウトプットをしていこうと思います。結論からいうと、**新規作成した後保存するかしないか**が違いです。
| メソッド名 | 挙動 |
|:-:|:-:|
| find_or_initialize_by | 新規作成した後保存しない |
| find_or_create_by | 新規作成した後保存する |恐らく使い道は、送信フォームで戻るボタンを実装する際に使われたりするのかなとおもいます。
【参考文献】
https://qiita.com/taimuzu/items/0a21738d018f475d63ae
本日の基礎練習問題(22/3/17)
**問題**
以下の要件を満たすlone_sumメソッドを実装しましょう。
配列に格納された3つの数値の合計を出力する
ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない
“`雛形
def lone_sum(ary)
# 処理を記述
end
“`
*呼び出し例
lone_sum([1, 2, 3])
*出力例
lone_sum([1, 2, 3]) → 6
lone_sum([3, 2, 3]) → 2
lone_sum([3, 3, 3]) → 0# 私の回答
“`
def lone_sum(ary)
newary = ary.uniq!
puts newary.sum
end# 呼び出し例
lone_sum([1, 2, 3])
“`
# 解説
まずuniq!メソッドで配列内の重複している数値を取り除く。
その後配列の合計値を出力する。# 模範回答
“`
def lone_sum(ary)
# 配列から、重複しない要素のみ取り出す
uniq_nums = []
ary.each do |num|
count
rails db:reset コマンドの挙動について
# はじめに
1月〜プログラミングスクールで学習しています。
これから平日は~3/25まで毎日何かしらアウトプットのため投稿を続ける予定です。
rails db:resetコマンドを実行した際に疑問に思った事があったのでメモを残します。
※Ruby2.6.5の環境を使用し学習しています。# 経緯
以前書いた`rails db:migrateを実行した時に出たエラーを解決した話`で書いていなかったのですが、
`rails db:reset`を実行後、再度`rails db:migrate`を実行してしまい、何も出力されずプロンプトが返ってきました。
そこで`rails db:reset`が気になり調べてみました。# 調べた結果
結論としては下記のような動きをしているようです。
[4.3 データベースをリセットする](https://railsguides.jp/active_record_migrations.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E3%83%AA%E3%82%BB
herokuにあげた後にエラー発生
## エラー画面
[](https://gyazo.com/2cf8bd6b44cb884d27f2982b66d5a8b9)– ログを見るように言われているのターミナルで下記を実行
“`
heroku logs –tail –app <<アプリケーション名>>
“`– ログで下記のエラーを発見
“`
ActiveRecord::StatementInvalid: Mysql2::Error: Table ‘resolutions’ already exists
“`
– resolutionsテーブルは既に存在しているというエラー
– herokuにアップ後デーブルを一度作成し直したのが原因と思われる
– `heroku run rails db:migrate:status`で確認してみます。
[
まずは、上記サイトに遷移。そしてGithubのリンクをクリックです。Gitのリポジトリに移動するはずです。
移動したら、「Clone or download」をクリックそして「Download ZIP」をクリックしましょう。zipファイルがダウンロードされるはずです。
ダウンロードしたZIPファイルを解凍しましょう。***炎の呼吸 奥義 玖ノ型 煉獄!!***
あ、できない方は普通に解凍しましょう。解凍された
【Ruby】指定日付内のランダムな日時を取得する
## 結論
rand関数で取得できます。
クラスに関係なく使えて便利。“`ruby
# DateTime(時間は0時0分で固定の様子)
> datetime_from = DateTime.parse(‘2022-01-01 00:00:00’)
> datetime_to = DateTime.parse(‘2022-12-31 00:00:00’)
> rand(datetime_from..datetime_to)
=> Sat, 30 Apr 2022 00:00:00 +0000# Time(ミリ秒まで細かくランダムにしてくれる)
> time_from = Time.parse(‘2022-01-01 00:00:00’)
> time_to = Time.parse(‘2022-12-31 00:00:00’)
> rand(time_from..time_to)
=> 2022-12-05 14:34:05 113996677/134217728 +0000# ActiveSupport::TimeZone(秒まで)
> timezone_fro
【Rails】ラジオボタンのラベルにクリック判定をつける
## はじめに
:::note warn
Rails学習のアウトプット記事です。実装の際は参考サイトも併せてご確認ください。
:::Ruby on Railsの学習中にて、フォームヘルパー機能を使ってラジオボタンとラベル(キャプション)を実装する際、ラベルとボタンが紐づいておらず、ラベルをクリックしても反応しなかった。
HTMLだとlabelタグでボタン自体を囲ってしまう方法があるそうだが、フォームヘルパーでラベルを生成する場合はfor属性を使ってボタンを指定する必要がある為、その記述方法を書いていく。
## 開発環境
– Rails 5.2.6
– Ruby 2.6.3
###
## 実装
### 前提条件
– **form_with**を使用
– 記事内で使用されているモデル・値は以下の通り項目|値
-|-
モデル名|Test
カラム名|status
カラム型|Boolean
### 生成されるHTML(ラジオボタン部分のみ)
“`html
【初心者用】RubyでCSVファイルを出力してみた# 1.やりたいこと
– Amazonの商品URLから`商品ID`と`商品名`を抽出
– `商品名`を抽出したうえで、エンコーディングを文字列に変換
– CSVファイルで書き出し# 2.やったこと
– AmazonのURLの構造は次のようになっている。
– そのうち、`商品名`と`商品ID`を取り出して、加工し、CSV出力したい。
“`Ruby:URLの構造
https://www.amazon.co.jp/商品名(エンコード)/dp/商品ID
“`
– 標準ライブラリの`uri`と`csv`を使用する
“`Ruby:output_csv.rb
require ‘uri’
require ‘csv’url_array = [
‘https://www.amazon.co.jp/%E3%82%B0%E3%83%AC%E3%83%B4%E3%82%A3%E3%82%AA-%E3%83%AA%E3%83%A5%E3%83%83%E3%82%AF-%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%AA%E3%83%A5%E3%83%83%E
【初心者】ルートのルーティング設定
# 目的
Railsチュートリアル学習の備忘録として## ルート(root)
Railsアプリを作成し、起動した後「http://localhost:3000/」
などのローカルホストにアクセスすると呼び出される## ルーティング(route/routing)
URLとアクションを結び付けること# ルートのルーティング設定とは
簡単に言うと、一番最初に表示されるページ(ルート)を指定(ルーティング設定)しちゃおうということです!# 設定方法
設定方法は簡単で
「config/routes.rb」のファイルを編集し、ルートに結び付けたいアクションを以下のように設定するだけです!
“`ruby:config/routes.rb
root ‘コントローラー名#アクション名’
“`たとえば
「applicationコントローラー」の
「helloアクション」をルートに結び付けたい場合は、、
“`ruby:config/routes.rb
root ‘application#hello’
“`
こう設定すると、
「http://localhost:3000/」
にアク
Rubyで複数の配列を比較して重複の値を取り出したり、排除したりする方法
## 概要
今回は`Ruby`で**複数の配列**を比較して重複する値を取り除いたり、重複する値のみを抽出したりする方法を調べたのでメモとして残しておきます。## やり方
### 重複した値を抽出“`ruby
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]a & b
# => [3, 4]
“`### 重複した値を取り除く
“`ruby
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]a – b
# => [1, 2, 5, 6]
“`
【Ruby】配列の中の配列とか、ハッシュの中のハッシュとか、モヤモヤするのでモデル化したら「シン・オブジェクト」が第4形態に進化した!【オブジェクトマッパー編】
# はじめに
Rubyでコードを書いてる時、配列の中の配列とか、ハッシュの中のハッシュとか、そういったデータ構造を取り扱うことってありませんか?
手軽にサクっと作れて、データ構造を表現するのに便利ですよね?でも、私はそういったデータ構造を取り扱う時ちょっとモヤモヤします。ハッシュや配列などのデータ構造を直接取り扱っていると、カッコやクォートなどの記号があふれていて、そういったちょっとした記号の理解がチリ積もとなって、脳内のワーキングメモリを持っていかれてしまいます。
だから、そういったむき出しのデータ構造を直接取り扱うのではなく、コードの関心事をわかりやすくするために、モデル化を行いたくなるのです。
この記事では、Gemなどを使うのではなく、実際にコードを書いてモデル化していきたいと思います。いきなり最終的なコードを提示するのではなく、モデル化にいたる過程を段階的に説明していくことで、オブジェクト指向っぽくするために、どのような考えで進めているのか、サンプルを提示したいと思います。
# これらに興味がある人向けの記事です
– オブジェクト指向
– モデル化
– メタプログ