Ruby関連のことを調べてみた2022年01月25日

Ruby関連のことを調べてみた2022年01月25日

【Rails】ページ遷移せずにいいねをしたい/取り消したい

みなさん、こんにちは!
筆者は大学生限定のプログラミングスクール「GeekSalon」でメンターをしています!
興味のある方や話だけでも聞いてみてい方はぜひのぞいてみてください?

https://geek-salon.com/?utm_source=Direct&utm_medium=attract&utm_campaign=3Q&utm_content=Fukuoka_B1_3Q

さっそく今回の本題に入っていきます!
今回は投稿に対するいいねを、ページ遷移せずともできる/取り消せるようにしていきたいと思います。

なお、いいね機能は実装済みという前提で話を進めていくため、いいね機能をまだ実装していない人は先にそちらの実装をお願いします。

また今回の実装では部分テンプレートを用いています。部分テンプレートについての理解が怪しい方は、[参考となる記事](https://qiita.com/okamoto_ryo/items/026b43e965a1180113ba)を載せておきますので、そちらも参照してください!

##実装環境
ruby 2.7.4p191 (2021-07-07

元記事を表示

【Ruby】配列に格納された数値の合計値を算出

※初心者向け
※アウトプット練習の為
※学習の復習

開発環境
rails 6.0.4.4
ruby 2.6.5

**概要**
配列に格納された3つの数値の合計を算出するプログラムを実装します。

##問題内容
以下の要件を満たすlone_sumメソッドを実装しましょう。

・配列に格納された3つの数値の合計を出力する
・ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない

**雛形**

“`ruby
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

##解答

“`ruby
def lone_sum(ary)
# 配列から、重複しない要素のみ取り出す
uniq_nums = []
ary.each do |num|
count = 0
ary.each do |i|
if nu

元記事を表示

[Ruby] URLエンコード済かどうかの確認をして二重エンコードを避ける

URLをエンコードした状態で保存する場合、`URI.encode`のような処理でエンコードすることが可能ですが、もし入力されたURLがエンコード済の場合、二重エンコードとなってしまい正しいURLではなくなってしまいます。この記事ではエンコード済かどうかの確認方法をまとめました。

### 結論

URLをデコードした文字列が元の文字列と一致する場合エンコードされていない状態、一致しない場合はエンコード済という判断が可能です。

“`ruby
Addressable::URI.unescape(url) != url ? Addressable::URI.encode(url) : url
“`

### 動作確認

Ruby 2.7.0から`URI.encode`がobsoleteになっているため、`Addressable`を使用しようと思います。

https://docs.knapsackpro.com/2020/uri-escape-is-obsolete-percent-encoding-your-query-string

https://github.com/spork

元記事を表示

Ruby3.1でherokuにデプロイしたらクラッシュした

## 起きたこと
herokuにデプロイしたらクラッシュしました。

“`
2022-01-24T00:27:57.846452+00:00 app[web.1]: => Run `bin/rails server –help` for more startup options
2022-01-24T00:27:58.231038+00:00 app[web.1]: Exiting
2022-01-24T00:27:58.236805+00:00 app[web.1]: /app/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.9.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:34:in `require’: cannot load such file — net/smtp (LoadError)

中略

2022-01-24T00:27:58.385873+00:00 heroku[web.1]: Process exited with status 1
2022-01-2

元記事を表示

Procの解説

Rubysilverの勉強をするなかで、ぼくが初めてみたprocというものを今回は解説していこうと思います。

(もしミスや誤解がありましたら、ご指摘のほどよろしくお願いいたします)

##ブロック
Procを理解するためには、ブロックというものを理解しないといけません。全然難しくないので、ご安心を。

ブロックというのは、簡単にいうと、**do~end**というやつです。例えば

“`
each @hoges do |hoge|
~~~
end
“`
よくみるeach文ですね。
このように、**do~end**で記述されるものをブロックといいます。
ここで大事なポイントなのが、**ブロックはオブジェクトではないという点がポイントです。**
オブジェクトに関して理解があやふやな方は、[こちら](https://qiita.com/IshidaKeisuke/items/787c956dab02e516eab9)の記事を読んでみてください。

オブジェクトではないことの最大のデメリットは、**使いまわしができないということです。**

##Proc
Procとは、先ほどブロッ

元記事を表示

インスタンス変数の隠蔽

##インスタンス変数の隠蔽

– インスタンス変数はアクセサメソッドで包み、直接参照しないようにする方がよい。

“`ruby
# bad
class Gear
def initialize(chainring, cog)
@chainring = chainring
@cog = cog
end

def ratio
@chainring / @cog.to_f # ← bad!
end
end

# good
class Gear
attr_reader :chainring, :cog

def initialize(chainring, cog)
@chainring = chainring
@cog = cog
end

def ratio
chainring / cog.to_f
end
end
“`

アクセサメソッド“`attr_reader“`を使うと、Rubyが下記のようなラッパーメソッドを定義してくれる。

“`ruby
def cog
@cog
end
“`

元記事を表示

[py2rb] 辞書クラスの拡張

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 辞書クラスの拡張 (Python)
“`python
def __setitem__(self, key, value):
if isinstance(value, float):
value = int(round(value))
elif not isinstance(value, int):
raise PyteomicsError(‘Only integers allowed as values in ‘
‘Composition, got {}.’.format(type(value).__name__))
if value: # reject 0’s
super(BasicComposition, self).__setitem__(key, value)
elif

元記事を表示

【RSpec】ActiveSupport::Durationで返るメソッドテスト

##ActiveSupport::Duration
ActiveSupportの拡張機能の1つ。

https://railsguides.jp/active_support_core_extensions.html

##Durationで返ってくるメソッドのテスト

RSpecでDurationで返ってくるメソッドのテストをするとき期待値をどう書こうか少し迷った。
“`ActiveSupport::Duration“` は“`to_i“`で秒数に変換できるので、変換前のDurationと変換後の秒数を比較してテストした。

“`ruby
describe ‘#calculate_writing_time’ do
it ‘著者の執筆時間を返すこと’ do
expect(Author.calculate_writing_time.to_i).to eq 10000
end
end
“`

##参考

https://techracho.bpsinc.jp/hachi8833/2017_02_07/34824

https://qiita.com/laboc

元記事を表示

[py2rb] partition, rpartition

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# partition, rpartition (Python)
“`python
s = ‘a,b,c’

print(s.partition(‘,’))
print(s.rpartition(‘,’))
print(s.partition(‘/’))
print(s.rpartition(‘/’))
print(s.partition(”))
print(s.rpartition(”))

(‘a’, ‘,’, ‘b,c’)
(‘a,b’, ‘,’, ‘c’)
(‘a,b,c’, ”, ”)
(”, ”, ‘a,b,c’)
ValueError: empty separator
“`
https://docs.python.org/ja/3.7/library/stdtypes.html#str.partition

文字列を区切りますが、空文字の場合エラーとなります。
# partition, rpartition (Ruby)
“`ruby
s = ‘a,b,c’

元記事を表示

Railsにおけるto_jsonのオプション

## 概要
今回は先日改めて学んだto_jsonのオプションについてアウトプットしたいと思います。
Railsのコントローラーなどでよく使用します。

## 環境
ruby: ‘3.0.1’
rails: ‘6.1.4.1’

## to_jsonについて
### to_jsonとは
`to_json`とはオブジェクトをJSON形式に変換してくれるメソッドです。

“`ruby
user = { id: 1, name: ‘user1’, age: 22 }

user.to_json #=> “{ \”id\”:1, \”name\”:\”user1\”, \”age\”:22 }”
“`
なお上記user定義はこの後の説明で使用していきます。

### よく使用するオプション各種
#### 1. include
`include`は__関連付けされているテーブルのカラムも一緒に取得__できるオプションです。
例えば、`user`を取得するときにその`user`が投稿した`post`データも一緒に取得したい場合などに使用します。

“`ruby
class User < App

元記事を表示

Ruby環境からPythonスクリプトを叩いてデータを得るまで

こんにちは。

Rubyを使っているとき、RubyからPythonスクリプトを叩いて、その結果をRubyで表示することが出来たらいいなと考えました。
想定するケース例としては、**RailsのバックエンドでPythonの機械学習コードを実行したい**といったものになります。

今回のブログでは、`Ruby環境からPythonスクリプトを叩いてデータを得るまで`について述べていきたいと思います。

このブログで得ることができる情報は以下になります。
>・Ruby環境でPythonスクリプトを実行したいときの手順
・Flaskの簡単な使い方
・RubyのNet::HTTPクラスの簡単な使い方

#実装した手順について簡単に概要を。

私が実装した方法は以下になります。
>**1. Flaskを用いて、PythonスクリプトをAPI化する
2. API化したものをローカル上で実行(Run)する
3. RubyのNet::HTTPクラスを用いてローカル上のAPIを叩く**

![image.png](https://qiita-image-store.s3.ap-northeast-1.ama

元記事を表示

【Ruby】偶数値の取得

※初心者向け
※アウトプット練習の為
※学習の復習

開発環境
rails 6.0.4.4
ruby 2.6.5

##問題内容
配列にある値の中から偶数の数をカウントして出力するメソッドを作りましょう。

**出力例:**
count_evens([2, 1, 2, 3, 4]) → 3
count_evens([1, 3, 5]) → 0

**ヒント**
even?というメソッドを使いましょう。

**even?メソッド**
Rubyが元々用意している、対象の数値が偶数かどうかを判断するメソッドです。
対象の要素の値が偶数であれば真を返し、そうでない場合は偽を返します。

“`
10.even?
#=> true

5.even?
#=> false
“`

##解答

“`ruby
def count_evens(nums)
count = 0
nums.each do |num|
if num.even?
count += 1
end
end
puts count
end
“`

##解説
配列の中の偶数の数を出

元記事を表示

アプリを作る 基本的ログイン機構

###ログイン機能を作る

####そのためにコントローラを作る

“`rb
ubuntu:~/environment/my_app (basic-login) $ rails generate controller Sessions new
Running via Spring preloader in process 15621
create app/controllers/sessions_controller.rb
route get ‘sessions/new’
invoke erb
create app/views/sessions
create app/views/sessions/new.html.erb
invoke test_unit
create test/controllers/sessions_controller_test.rb
invoke helper
create app/helpers/sessions_h

元記事を表示

アプリを作る ユーザー登録

##ユーザーを登録する
###ユーザーを表示させる

####デバッグ情報を追加する
app/views/layouts/application.html.erb

“`


.
.
.

<%= render 'layouts/header' %>

<%= yield %>

<%= render 'layouts/footer' %>
<%= debug(params) if Rails.env.development? %>


“`
####デバックの情報のCSSの表示
app/assets/stylesheets/custom.scss

“`c

元記事を表示

Railsで全てのレコードを検索する

##全てのテーブルの全てのレコードの中から特定の単語を検索する方法

以下のコードをコピーして、検索したい文字列を入力して、コンソールで実行するだけで検索できます。

“`search_word.rb
ActiveRecord::Base.connection.tables.each do |table|
model_name = “#{table.camelize.chop}”.constantize rescue next
model_name.column_names.each do |column_name|
if model_name.columns_hash[“#{column_name}”].type.to_s == (“string” || “text”)
pp table_model.where(“#{column_name} like ?”, ‘%ここに検索したい文字を入力%’) rescue next
end
end
end
“`

##よくわかる解説

大まかな方針としては、“(モデル名).where(“カラム名

元記事を表示

ruby on rails アセットパイプライン

## はじめに
ruby on rails チュートリアルを学習中
初学者

## アセットパイプラインとは
簡単に言えば複数のファイルを一つにまとめるための機能
scssを最終的に1つのcssにまとめる等
今では多くの言語でファイルをバンドルしているが、ruby on railsにアセットパイプラインが追加されたのをきっかけに
多くの言語やFWで取り入れられたらしい。

## Railsでのアセットパイプライン
**理解するべきこと3つ**

– アセットディレクトリ
– マニフェストファイル
– プリプロセッサエンジン

### アセットディレクトリ
アセット(画像やcss(scss))の置き場所
railsの場合`app/assets`に`stylesheetsやimagesディレクトリ`がある
`sample.svg`を保存する場合
`app/assets/images/sample.svg`となる
画像やcssの置き場所を固定することで、開発者間での違いをなくすことができ、開発効率や保守性を上げることができる

### マニフェストファイル
静的ファイル(アセット)をどのよう

元記事を表示

【Rails】bulletで検知できないN+1を解消する part1

#初めに
Railsのviewの表示速度の低下理由として、partialの使いすぎやN+1問題があります。
このN+1問題を検知するgemとして、有名なのがbulletです
ただし、全てのN+1を検知してくるわけではありせん

###本記事について
bulletで検知できないN+1が発生した時の対処法を僕なりに書いた記事になっております。
間違ったことなどがあれば、ご指摘ください。

#本文
###モデルの定義
まずは、モデルを定義します。
コーヒー豆(bean)とレビュー(review)が1対多で関連付けされています。
beanにはコーヒー豆の名前と国、説明のカラムが存在しています。
reviewにはレビュー内容と香り・甘味・苦味・コク・酸味のカラムが設定されています
香り・甘味・苦味・コク・酸味は1から5の数字で評価していただく形になっています。

“`ruby:bean.rb
# Table name: beans
#
# id :bigint not null, primary key
# name :strin

元記事を表示

Ruby on Railsでアプリを作成してみた【1】【recipegram】

##参考サイト
[【プログラミング入門】Ruby on Rails でウェブアプリを作ってみよう ~ PART 1(イントロダクション)~ Let’s build with Ruby on Rails]
(https://www.youtube.com/watch?v=auLih2TFwio&t=647s)

元記事を表示

Rails 複数 画像投稿 Cloudinary CarrierWave

# 環境
ruby 3.0.2
Rails 6.1.4.4

# 実装
cloudinaryの登録を済ませてください

https://cloudinary.com/

## gemの追加

“`ruby:Gemfile
gem ‘carrierwave’
gem ‘cloudinary’
“`

“`
$ bundle install
“`

## モデルの作成
PostとImageは1対多のアソシエーションで実装します

“`
$ rails g model post body:string
$ rails g model image post:references, image:string
$ rails db:migrate
“`
“`ruby:models/image.rb
class Image < ApplicationRecord belongs_to :post mount_uploader :image, ImageUploader end ``` ```ruby:models/post.rb class Image < Applicati

元記事を表示

form_withを使ったRails.fireの使い方

## form_withを使ったRails.fireの使い方

JS側からsubmitを行う方法として、Rails.fireを使う方法があります。
Rails.fireを使うとajax通信が可能になります。
form_withの中で、local: falseを指定することによって、html.erbがコンパイルされた結果のhtmlに「data-remote=”true”」が記述される様になり、ajax通信が可能になります。

– html.erb側

“`
<%= form_with(model: @hoge, url: '', id: 'hoge_form', local: false) do |f| %>
<%= f.text_field :name, placeholder: 'test' %>
<%= f.button id: 'hoge_submit' ,type:'button' %>
<% end %>
“`

– js側

“`
import Rails from “@rails/ujs”;

$(document).on (‘turbolinks:load

元記事を表示

OTHERカテゴリの最新記事