Ruby関連のことを調べてみた2021年02月19日

Ruby関連のことを調べてみた2021年02月19日

【Rails】counter_cultureの処理を追ってみた

# なにこれ
筆者が業務でrailsのcounter_cultureというgemを使用する機会がありました。
そこで機能が正しく動作するかを確認するために、gemの処理内容を理解しようとソースコードを読みました。
それらをまとめた備忘録です!

## お願いしたいこと
筆者はこういった処理を追ってみる解説が初めてです。
記事を読みやすくするために、不要なオプションなどの記述を削除して、必要な機能の解説に留めているつもりです!

また、間違っている点などがありましたら、ご指摘いただけますと幸いです。
それでは、よろしくお願いいたします。

# 前提条件
この記事は↓の3つを理解しているものとして進めます。(継承、proc、アソシエーションなど)
– Rubyのチェリー本
– Railsチュートリアル
– その他、オブジェクト指向に関する知識

また、今回説明するcounter_cultureのバージョンは`2.7`です。(2021/02/19現在)

# そもそもcounter_cultureってなに
Ruby on Railsには、counter_cacheという親レコードが持ってる子

元記事を表示

RubyのJIT について調べたことをまとめる

Rubyの処理系に個人的に興味があり、RubyのJITについて調べたことをまとめます。
処理系についてはほぼ初心者(cコンパイラを少し書いたくらい)の記事なので、間違いがあれば教えていただきたいです。

## そもそもJITとは
JITは、中間言語を採用するインタープリタ型の言語において(`JavaScript`や`Ruby`, `Python`, `Java`など)、中間言語の実行を早くするための処理系レベルでの最適化の仕組みです。
JITはJust In Time Compilerの略で、実行時に中間言語を機械語にコンパイルし、キャッシュしておくことで、バイトコードの実行よりも高速に処理を行うことができます。
JIT自体は色々な言語で色々な実装があり、Javaの`HotSpot`や、Pythonの`Numba`、JavaScriptの処理系であるV8の`Turbofan`などがあります。

今回は、Ruby2.6より採用された`MJIT`に関する情報をまとめました。

## Ruby3.0におけるMJITのアーキテクチャ

![スクリーンショット 2021-02-18 17.2

元記事を表示

Rubyで安全にevalしたくて怖いプログラム作った

なんかこんな感じにしたら安全にevalできないかなっていう感じ。
まぁ拾ってきたコードがほとんどなんだけど。

参考

Rubyのサンドボックスを作って、evalするBotを作った

教えてruby強い人。

“`ruby:ruby
# Sandbox http://tolarian-academy.net/ruby-sandbox-eval-bot/

### usage
# begin
# EvalSandbox.new.execute(code)
# rescue SecurityError, SyntaxError => e
# e.message
# rescue Error => e
# e.message
# end

class EvalSandbox
module Sandbox
[File, Dir, IO, Process, FileTest, RubyVM, RubyVM::InstructionSequence, ObjectSpace].each do |klass|
refine

元記事を表示

【Rails】レスポンシブデザインを導入する

##1、viewportの設定

##viewport(ビューポート)とは
“`
「表示領域」
  Webページの横幅が、viewportとなる。
“`

viewportを設定していないPC向けのページをスマートフォンで表示すると、文字もページも小さくなってしまう。
そこで、viewportを指定することで、画面幅いっぱいにコンテンツや本文がおさまるようにしていく。
ただ、viewportを設定しただけでは最適化されたとは言えない。
viewportでは表示領域を設定して、ページが見やすいように拡大されているだけになっている。
そのため、スマートフォン用にCSSでレイアウトを設定してあげる必要がある。

##viewportのmetaタグを記述する
“`application.html.erb




元記事を表示

Herokuにデプロイする際、背景画像が表示されないことの解決

#概要
背景画像について
local → 表示○
Heroku上 → 表示×

Heroku上で背景画像が表示されないことの解決方法を、本記事では述べています。

#バージョン
rubyのバージョン ruby-2.6.5
Railsのバージョン Rails:6.0.0

#解決方法

config/environments/production.rbを以下のように書き換える。

(変更前)config.assets.compile = false

(変更後)config.assets.compile = true

“`config/environments/production.rb

〜省略〜

# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = true # =false → trueに変更

# Enable serving of images, stylesheets, and JavaScripts from an

元記事を表示

【Rails】 初心者向け!テーブルにカラムを追加・変更をするとき(2パターン)

はじめに

テーブルを作成した後にいざ作業に取り組もうと思っていたら、カラム名に誤字脱字があった、後から何か追加しなければいけなくなった、なんていう時があるかと思います。
私自身も学習を始めた初期の頃は、よく目の当たりにし、マイグレーションファイルは厄介だし触りたくないと絶望した記憶があります。
コマンドを忘れてしまいがちなので、そんな時の対処法を備忘録として記しておきます。

解決方法①

####メリット
● 追加や削除を行っても既存のファイルのみで変更が行えるので、ファイルが無駄に増えない。
####デメリット
● いつ何に追加や変更を加えたのかが分からない。
=チーム開発など自分以外の人と共同で作業する場合には、向かないとも言える。

①現在のテーブルの状態を確認します。
ここでupと表示が出ているものに関しては、rails db:migrateコマンドにより既にマイグレーションが実行されたものになります。

“`terminal.
$ rails db:migrate:status
up 20210209151659 Create u

元記事を表示

【Rails】Initialization autoloaded the constants ActionText::ContentHelper and ActionText::TagHelper 警告の解決パターン

## 発生する問題

既存のRailsアプリケーションをRails 6やRails 6.1にアップグレードすると、テストを実行したりした際に次のような警告が出る場合がある。

“`
DEPRECATION WARNING: Initialization autoloaded the constants ActionText::ContentHelper and ActionText::TagHelper.

Being able to do this is deprecated. Autoloading during initialization is going
to be an error condition in future versions of Rails.

Reloading does not reboot the application, and therefore code executed during
initialization does not run again. So, if you reload ActionText::ContentHelper,

元記事を表示

インスタンスメソッドとクラスメソッド

インスタンスメソッド
==
+ 生成されたインスタンスが使用可能
+ インスタンスで管理したい情報の処理に使用

“`ruby
class クラス名
 def メソッド名
  処理
 end
end
“`

クラスメソッド
==

+ クラス自信が使用可能
+ クラスで共通の情報を使った処理に使用

“`ruby
class クラス名
def self.メソッド名
処理
end
end
“`

元記事を表示

【Rails】【gem nested_form】link_to_addで動的に追加した要素にJSを反映させる方法

#結論
nested_formを使用しているページに、以下のJSを記述します。

“`javascript
$(document).on(‘nested:fieldAdded’, function(event){
// ここに要素追加後に実行したい処理を書く
})
“`

#もう少し詳しく

以下のようにして、本当に追加後に処理が実行されるか試してみてください。

“`javascript
$(document).on(‘nested:fieldAdded’, function(event){
// 試しにアラートできるかどうかやってみる
alert(‘要素が追加されました’);
})
“`

元記事を表示

renderメソッドでGoogleMapが消える!? [Rails][Ruby]

#発生した不具合
renderメソッドを使いエラー文を表示させる実装途中、renderメソッドによるページ遷移後に、導入していたGoogleMapが表示されない事が判明した。

#解決方法
結論としては、renderメソッドを使わず、`redirect_toメソッド`を使用します。

*早めにエラーを解決したかったので、この不具合に関する原因について、この記事では言及しておりません。

#変更点

“`ruby:変更前
class CommentsController < ApplicationController before_action :authenticate_user! def create @comment = current_user.comments.build(comment_params) if @comment.save redirect_to board_path(params[:board_id]) else render template: 'boards/show' end end

元記事を表示

[Rails]current_page?を活用する。

# 書くこと
railsのcurrent_page?を用いた条件分岐について

##環境
Ruby 2.6.5
Rails 6.0.3.4

## 結論
current_page?で、現在のページに指定のURLが含まれているかを判断する。

## ぶち当たった課題
現在取り組んでいるポートフォリオの作成において、**問い合わせフォーム**の作成を行うことにした。そこで、「問い合わせフォームの画面以外に」、そのリンクを設置しようとした。(具体的にはfooter)

“`application.html.erb
(中略)

お問い合わせはこちらから
<%= link_to "お問い合わせフォーム", new_contact_path%>

(中略)
“`
しかし、application.html.erbに記述すると、すべてのerbページに表示されてしまうため、これではお問い合わせページにも反映されてしまう。

##current_page?で条件分岐させる。
そこで、前述のcurrent_page?を[公式ドキュメント](https:

元記事を表示

Rubyでバイナリーサーチを作ってみた。

# はじめに
私は、基本ミニアプリを作成し学習のアウトプットを行っています。
それを備忘録として残したいと思います。

# バイナリーサーチとは

配列の中のデータを検索するときに使用する手法です。配列内には同一の数値はないものとしています。

中央の値を確認し、検索したい値と大小の関係を用いて検索したい値が中央の右か左かを判断します。
それを繰り返しながら検索していく手法です。

“`

8の位置が知りたい場合
[1,2,3,4,5,6,7,8,9,10]
中央値をとるので5番目の「5」が中央値となります。
8は5より大きいので、次は7~10の配列を検索します。
[7,8,9,10]
中央値をとるので2番目の「8」が中央値となり、検索が終了します。
“`

実際のコード

“`ruby

1 def binary_search(array, number_of_elements, target)
2 left = 0
3 right = number_of_elements – 1
4 while left <= right 5 center = (left +

元記事を表示

TOPPERS/ASP3のビルド環境の検証

##補足
2021/02/16
・**Ruby 2.7.2**のインストール失敗は **libssl-dev**パッケージ不足のためで、環境構築を含めて修正しました。

・**Ruby 2.7**系でTOPPERS/ASP3のコンフィギュレーションの失敗は Rubyの**shellライブラリ**不足のためで、ライブラリのインストールを追記し、結果も修正しました。

##はじめに

以前に「TOPPERS/ASP3をビルドして動かしてみる」と題して PC上の Linuxで
TOPPERS/ASP3をビルドしてSTM32F401-Nucleoで動作させるまでの手順の記事を記しました。

【Qiita】TOPPERS/ASP3をビルドして動かしてみる
 https://qiita.com/Yukiya_Ishioka/items/63618319d47ac743a631

その後、TOPPERS/ASP3の新しい版のソースが公開されされていること

元記事を表示

presence:trueとNot Null制約について

#本記事について
本記事は、筆者自身の備忘録を形にして残すことで後の復習に役立てることと、同じ様なプログラミング初学者の方のお役に立てれば、という思いで作成するものであります。
誤り等ある場合には、お手数ですがご連絡いただけますと幸いです。
#本記事の内容
本記事では、Ruby on Railsを使用して開発をしていく中で筆者自身がはっきりと定義づけられなかった`presence:true`と`Not Null`制約について記しておきます。
#presence:true
こちらはモデルに記述するもの。
バリデーションと呼び、他にも様々な正規表現を使ったバリデーションを設けることができる。
(以下参照元URL)
https://gist.github.com/nashirox/38323d5b51063ede1d41
お世話になってます?‍♂️

#Not Null制約
マイグレーションファイルに記述するもの。

t. string :name, null:false
この様に記述する。

#presence:true と Not Null制約の違い
データが空の時にエラーが出る

元記事を表示

Rubyで早期リターンを使用してif文のネストから解放される方法(備忘録)

## はじめに
if文が何重にもネストされると頭がこんがらがる闇から解放されるべく
早期リターン(early return)という手法を使用する。

* 初学者のただの備忘録です。

## 環境
– Ruby: 2.6.6
– Rails: 6.0.3.5

## 簡単な例
コードにあまり意味はありません。

“`ruby
def example(hoge)
if hoge.nil? # hogeがnilならtrue、nilでなければfalseを返す
true
else
false
end
end
“`

これを早期リターンで書くと

“`ruby
def example(hoge)
return true if hoge.nil? # returnが必須
false
end
“`
こう書けます。

## 実装
先ほどは簡単なif文でしたが少しだけややこしくなると

“`ruby
def self.existing_ideas(category_name)
if category_na

元記事を表示

railsを使ってアプリを作る2

####テーブルの作成と操作方法

#####DBにテーブルを作成する時は2つの手順がある
1, データベースに変更を支持するファイルを作成する (マイグレーションファイルの作成)
 rails g model Animal name:text
 Animalsテーブルを作成して、text型のnameカラムを作成
 rails g model コマンドを実行すると、Animalsテーブルを操作する為のAnimalモデルも一緒に作成してくれる

2, 作成したファイルを読み込んでDBに反映する
 rails db:migrate

#####作ったテーブルにデータを作成する
1, newメソッドでAnimalモデルのインスタンスを作成
 animal = Animal.new(name: “らいおん”)
 
2, animalsテーブルに保存
 animal.save

#####テーブルからデータの取り出し方
全部の取得  Animal.all 対象がない時は空の配列が返ってくる
最初の1件  Animal.first 対象がない時はnilが返ってくる
pkのみ取得  Animal.f

元記事を表示

定数の指定とか

メモですめっちゃ適当です。

“`ruby
class City < Japan::Prefecture ``` の<と::がなんだっけとなったので復習しました。 <はクラスの継承、 ::は名前空間つきの定数を参照するのに使う。 なので、上の例では名前空間付きのクラスを継承するときに正しく名前解決するために::をつけている。 ```ruby module A class B def self.print_str print "aiueo" end end end B.print_str # => uninitialized constantとか

A::B.print_str # => “aiueo”
“`
定義済みのモジュールを名前空間として使用する場合、以下のようにクラスを定義することができる。
moduleAが定義済みの場合は上と同じことになる。

“`ruby
class A::B
end
“`

元記事を表示

クラス内における同一クラスに対するクラスメソッドのクラス省略について(備忘録)

## 概要
初学者のただの備忘録です。

## 環境
– Ruby: 2.6.6
– Rails: 6.0.3.5

## 実装
例えば下記のようなCategoryクラスでhogehogeというクラスメソッドを定義する。

“`ruby:app/models/category.rb
class Category < ApplicationRecord def self.hogehoge category = Category.find_by(name: category_name) return category.ideas if category.present? [] end end ``` hogehogeメソッドの1行目Category.find_by(name: category_name)は Categoryというクラス(class Category < ApplicationRecord)で hogehogeメソッドの中で Categoryクラスに対してfind_by(name: category_name)している。 だからクラ

元記事を表示

タブ文字ありで桁揃えされたコードからタブ幅を推定

コードなどを書く際、タブ文字をインデントに使えばエディター側の設定で自分好みの幅に変えられる。GitHubでもURLに `ts=2` などのクエリを追加すれば反映される。

一方で、コメントや配列要素などの**桁揃え**の目的で使うと、一見手軽に揃えられるように見えるが、タブ幅を変えると崩れてしまうことがほとんど。

“`ruby:タブ幅が2の前提で書いたコード
func( # とあるメソッド
arg,
key: “test”,
log_level: :DEBUG # 何かのオプション
)
“`

“`ruby:タブ幅を4に変えた場合
func( # とあるメソッド
arg,
key: “test”,
log_level: :DEBUG # 何かのオプション
)
“`

では逆に、「この箇所は桁揃えしているはず」という仮定をおくことで、**本来のタブ幅を推定できる**のではないか。問

元記事を表示

[Rails][HTML,CSS] JQueryを使わず背景画像をアニメーションにする

#実装したいこと
![2645675c398a8c681074fc97e255733b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092914/100ebe86-28bf-34c4-8beb-975a21b1f4fc.gif)

このように背景画像がフェードイン、アウトを繰り返すようにCSSを設定していきます。

#HTML

“`html:html

“`
使用する画像の数だけ子要素を用意しましょう。
私の場合4枚の画像を使うため、今回は、上記のように4枚分子要素を用意します。

#CSS

“`css:css
.box {
position : relative;
wi

元記事を表示

OTHERカテゴリの最新記事