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

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

【Rails】acts_as_listで並べ替え機能を実装

## 導入
“`rb:Gemfile
gem ‘acts_as_list’
“`
“`bash
$ bundle install
“`
“`rb:app/models/task.rb
class Task < ApplicationRecord acts_as_list end ``` ```bash rails g migration AddPositionToTask position:integer ``` ```rb class AddPositionToTask < ActiveRecord::Migration[6.0] def change add_column :tasks, :position, :integer #カラム名はpositionじゃなきゃいけない end end ``` ```bash $ rails db:migrate ``` ```config/routes.rb resources :tasks do member do get :move_higher get :move_lower end

元記事を表示

RailsでCustom Validatorの実装例

## 最初に
みなさん、Custom Validator使ってますか?

[rails guide](https://railsguides.jp/active_record_validations.html)の[ここ](https://railsguides.jp/active_record_validations.html#カスタムバリデーションを実行する)にも記載されていますが`ActiveModel::Validator`や`ActiveModel::EachValidator`を使って自作のvalidatorを作成することができます。

異なるmodelで同じようなvalidationを実行する場合は以下のようなメリットがあるので是非使っていきましょう。
・modelのコードを減らせる
・specの行数を減らせる
(Validator Classへspecを書けば良いので同じようなspecを減らせます)

## 実装例
よくあるパターンだと思うのですが異なるmodelでメールアドレスカラムを持っており、同じようなvalidationを実装する場合の実装例を記載します。

元記事を表示

Railsでお気に入り機能を実装する

##自己紹介
9月から独学でプログラミング学習を開始し、
11月からスクールを使って学習をしています。
現在はポートフォリオの作成し転職活動中です。
知識を定着させるために、学びをアウトプットしています。
また、これから学び始める方の参考になることを願っています。
***
##開発環境
– Ruby 3.0
– Ruby on Rails 6.0.3.4

#お気に入り機能を実装する

今回は**socialization**というgemを使用します。
>▼詳しくは公式のGithubはご覧ください。
https://github.com/cmer/socialization

現在、**User**テーブルと映画情報を保存する**Movie**テーブルがあるとします。
まずは、`Gemfile`に下記を追加します。

“`
gem ‘socialization’
“`

追加したら、`bundle install`を実行し、gemを追加してください。

次に、`rails generate socialization -s`を実行します。
実行すると、`like.rb` `fol

元記事を表示

DockerでRails開発時に,画像の保存先をAWS S3にする

先日,Rails, Dockerでの開発時に画像の保存先をローカルからS3に変更した際の手順を記録した.

## 開発環境
WSL2 (ubuntu 18.04 LTS)
Docker
– Ruby (2.7.1)
– Rails (6.0.3)

## 画像をS3に保存する手順

Active Storageがインストールされており,S3バケット作成まで完了していることを想定

Active Storageのインストールは以下のコマンドでできる

“`sh:terminal
docker-compose run コンテナ名 rails active_storage:install
docker-compose run コンテナ名 rails db:migrate
“`

#### 用意するもの

– S3バケット情報
– バケット名
– リージョン

– IAMユーザー情報
– アクセスキー
– シークレットアクセスキー

#### 手順
##### 1. root dirにて以下のコマンドを実行

“`sh:terminal
docker exec –

元記事を表示

Association ; 1対1、1対多、多対多について

## Association
Rails には関連 (Association) という仕組みがある。関連付けを用いて二つのモデルをつなぐことで、コードをシンプル、かつ簡単に書くことができる。
関連付けの関係は大きく分けて以下の三種類に分類される。

* 1 対 1
* 1 対 多
* 多 対 多

### 1 対 1 (has_one, belongs_to)
例えば、Teacher, Class, Student, Subject のモデルで以下の図のような関係性があったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070052/fda4c427-5edf-6c91-1233-bd196f7fcd53.png)

まずはTeacherとClassの関係性を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070052/485e581d-9385-565d-d50

元記事を表示

【Rails】 Deviseを複数導入する場合

はじめに

deviseを導入すると、簡単に認証機能が実装できて本当に便利なgemですよね!
Ruby on Railsを学び始めて2ヶ月目の頃、ユーザーと管理者に分けてdevise機能を2つ実装したい、こういった時はどうしたら良いのか、また複数のdevise間で両者とも使用するモデルに関してはどうしたら良いのか、と少し悩んだことがありましたので、今回の記事のテーマに選定致しました。

前提

今回説明するモデルを以下の三点に絞らせて頂いております。
● devise User
● devise Admin
● 両者に共通してItemモデルを使用

開発環境

ruby 2.6.3
Rails 5.2.4.4

gemを導入

“`Gemfile.
gem ‘devise’
“`
“`terminal.
$ bundle install
“`

ユーザー用、管理者用のdevise機能実装

deviseを複数実装することは意外と簡単です!
User、Adminのように適宜名前を付け、各コマンドを実行すればモ

元記事を表示

【Ruby on Rails】before_actionを使って全てのアクションで同じ処理を行う

# 同じ処理をbefore_actionで定義する。

あるコントローラー内の全てのアクションで1つの処理を使い回したい時。

“`.rb
class Api::V1::Admin::CompanyAdminsController < ApplicationController def index company_admins = CompanyAdmin.where(company_id: params[:company_id]) json_response(200, CompanyAdminIndexSerializer.new(company_admins).to_h) end def show company_admin = CompanyAdmin.find params[:id] json_response(:ok, serialize_data(CompanyAdminIndexSerializer, company_admin)) end def destroy company_admin = Com

元記事を表示

【Railsチュートリアル】第10章 ユーザーの更新・表示・削除②

# 10.3 すべてのユーザーを表示する
`index`アクションを追加して、すべてのユーザーを一覧表示する。データベースにサンプルデータを追加する方法や、将来ユーザー数が膨大になってもindexページを問題なく表示できるようにするためのユーザー出力のページネーション(pagination=ページ分割)の方法を学ぶ。

## 10.3.1 ユーザーの一覧ページ
ユーザーのindexページはログインしたユーザーにしか見せないようにし、未登録のユーザーがデフォルトで表示できるページを制限する。

indexアクションが正しくリダイレクトするか検証するテストを書く。

“`ruby:test/controllers/users_controller_test.rb
require ‘test_helper’

class UsersControllerTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) @other_user = users(:archer)

元記事を表示

一覧表示での進捗率ゲージの作成

# はじめに
オリジナルアプリでクラウドファンディングサイトを作成した際に、
jQueryを使って進捗率ゲージを作成したので紹介します。
前回、詳細画面での作成方法を紹介しましたが
今回は一覧表示画面での作成方法です。

[![Image from Gyazo](https://i.gyazo.com/9d48b4ecd07f0773ae0f8649277a7115.jpg)](https://gyazo.com/9d48b4ecd07f0773ae0f8649277a7115)

詳細画面での作成はこちら→
https://qiita.com/takiguchiharuna1221/items/df517f2a9e4b74299328#comment-bd0d8efa2c7c3dc7651e
※こちらではlinear-gradientを使った別の方法も投稿していただいています。

初学者なのでより良い方法が他にもあるかもしれませんが、どなたかの参考になれば嬉しいです。

# 環境
・Rails 6.0.0
・Ruby 2.6.5
・jQuery

# 作成手順
【view】

“`

元記事を表示

RSpec:モデルの単体テストの記述例

今回は前回の記事「[RSpecの導入&関係の深いgemについて](https://qiita.com/yamaday0u/items/c3bf6036e11298771a99)」の続きで、モデルの単体テストを行います。

前回の記事の各gemのインストール、初期設定が完了していることを前提としています。

##モデルのテストファイルを作成
ターミナルで`rails g rspec model モデル名`コマンドを入力してテストファイルを生成します。

“`zsh:ターミナル
$ rails g rspec model モデル名
#以下のように表示されればテストファイルの生成が成功しています。
Running via Spring preloader in process 1234
create spec/models/モデル名_spec.rb
invoke factory_bot
create spec/factories/モデル名の複数形.rb
“`

たとえばuserモデルのテストファイルを生成するとこうなります。

“`zsh:

元記事を表示

[解決] Railsの言語設定エラー ’translation missing: ja.datetime.distance_in_words.x_days ago’ 

## 現状確認

ruby 2.6.6
Rails 6.1.0

インスタンス変数は、正しく定義されている。

“`ruby
[1] pry(#<#>)> @post.created_at
=> Sun, 31 Jan 2021 08:28:26.434149000 UTC +00:00
[2] pry(#<#>)> time_ago_in_words(@post.created_at)
=> “translation missing: ja.datetime.distance_in_words.x_days”
“`

ファイルを見ると、日本語になっている(自分がen→jaに変えたことに気づいていなかった)

“`ruby:application.rb
config.i18n.default_locale = :ja
“`

## 解決

今までtime_ago_in_wordsは英語設定だったから、上記の日本語変更でエラーが起きたっぽい

time_ago_in_words

元記事を表示

【Rails】Capistrano main以外のブランチをデプロイする方法

通常、mainブランチをcapistranoでデプロイする時、このように入力すると思います。

“`terminal
$ bundle exec cap production deploy
“`

ただ、開発中にmain以外のブランチをデプロイして確認したい時もあると思います。
そんな時は、

config/deploy.rbに追記して

“`terminal
$ set :branch, ENV[‘BRANCH’] || “main”
“`
デプロイする。

“`terminal
bundle exec cap production deploy BRANCH=ブランチ名
“`

特に指定しなければmainが、main以外ならブランチ名を指定してやれば、それぞれデプロイできます。

元記事を表示

RubyでHit&Blow書いてみた

http://vipprog.net/wiki/exercise.html#ffeaab60

ここの数当てゲーム2を解いてみました

#コード

“`Ruby
class Answer
def initialize(digits)
num = %w[1 2 3 4 5 6 7 8 9]

first_num = num.delete(num.sample)
remaining_num = num.push(“0”).sample(digits – 1)

@answer = [first_num, *remaining_num]
@count_hit_and_blow = Hash.new(0)
@digits = digits
end

def judge_hit(entry)
entry_judeged_hit = entry.dup

entry.zip(@answer) do |n|
if n.uniq!
@coun

元記事を表示

【Rubyで検証】普通な人はあまり存在しない件 〜 普通の人とマッチングする確率とは?な話

![kataomoi_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/0a6db5d4-9fb3-1a10-ef55-1e9703a44a92.png)

> 「私、結婚する人の条件はふつうな人(年収700万)でいいの〜」
(なお、サラリーマンの平均年収は約400万)

みたいな話は有名かと思いますが、ほんとうに普通の人ってなかなかいないよねというお話です
(半分真面目に、半分ふざけて計算してみた)

## 今回のメインテーマ
ざっくり話をまとめると、次のようなことをお伝えする記事となっております

* **普通の人ってどのくらいの確率で存在するの?**
* **↑の計算するのにRubyでどうプログラムすれば良いの?**

この記事をきっかけに、`統計`や`Ruby`について親しみを持ってもらえればと思います

## 前提
まずは前提条件を整理しておかないと変な文句を言われかねないので、整理しておきます(というかこれをしないと計算できない)

**普通の人の定義**
以下の各項

元記事を表示

2重ハッシュ

“`Ruby
user_data = [
{user: {profile: {name: ‘Choco’}}},
{user: {profile: {name: ‘Ramune’}}},
{user: {profile: {name: ‘Sakura’}}},
]
“`
ここからeachメソッドを使って全てのユーザーの名前を出力したいと思います。

ハッシュから特定の値を取得する場合はその値に対応するキーを指定します。

“`
ハッシュ[取得したい値のキー]
“`

2重ハッシュから特定の値を取得する場合は、取得したい値のキーまでを連続して指定します。

“`
ハッシュ[取得したい値のキー][取得したい値のキー]
“`

冒頭の記述では配列の中にハッシュが格納されています。
ハッシュの1つ1つを取り出すためにeach文を用いて記述します。

“`Ruby
user_data.each do |x|
puts x[:user][:profile][:name]
end
“`

ブロック変数をxとしました。
Rubyファイルの記述をまとめるとこのようになります。

元記事を表示

renderにおけるlocalsとcollectionについて

localsとcollectionのオプションについての理解を深めようとこの記事を書くことにしました。
##1.localsについて

仮にposts_controllersに以下の記述があるとして

“`posts_controllers.rb
def show
@post = Post.find(params[:id)
end
“`

“`posts/foobar.html.erb
<%= render partial: 'post_partial', locals: { post: @post } %>

または省略形で
<%= rendner 'post_partial', post: @post %>
“`

“`posts/_post_partila.html.erb
<%= post.title%>
<%= post.body %>
“`

“`公式
公式(省略形)
<%= render 'パーシャル名', ローカル変数: インスタンス変数名 %>
“`

つまりlocalsオプションを使用することで
@postというインスタンス変数をpostという

元記事を表示

文字列のなかで変数を使いたい

html.erb形式にて、
文字列のなかに変数を含めたい

例えばpost変数の作成日を書くとき、

“`
<%= "作成日:#{post.create_at}" %>
“`

___
初心者にとってはこれでもすごい

元記事を表示

Railsでリンクを押すとなぜかcssが適用されてしまう??

## 概要
現在Railsでアプリを作成しているのですが、
Vue.jsを導入してから、リンクを押すとcssのスタイルが適用されてしまうバグが起きるようになりました。

## 試したこと
HTML,CSS,Vue.jsを少しずつ削って、どこが原因か探る作業を行いました。
(めちゃくちゃ時間かかった、、、)

結局解決できず。

## 解決策
application.jsのTurbolinksを無効化することで解決しました。

“`application.js
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You’re encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that co

元記事を表示

Boolean型からString型にする方法

#問題
bにboolean型でtrueかfalseが与えられる時、string型に変更せよ。

“`
def boolean_to_string(b)
return
end
“`

##解答1
“`
def boolean_to_string(b)
b ? “true” : “false”
end
“`

三項演算子なるほど。

##解答2
“`
def boolean_to_string(b)
b.to_s
end
“`

##解答3
“`
def boolean_to_string(b)
b.inspect
end

“`
inspect使ったことないですができるんですね!

## 感想

`Codewars`は他の人が書いたコードが読めるのですごく勉強になりますね!

元記事を表示

Railsのdeviseを使用して複数のログイン画面を実装する方法

## deviseとは
Railsのgem(ライブラリ)の1つ。
ログイン機能の実装を簡単にしてくれるgemです。
これからdeviseを使用して複数のログイン画面を実装していきます。
## インストール・準備
Gemfileに追記

“`rails:Gemfile
gem ‘devise’
“`

bundleまたはbundle install実行

“`
$ bundle install
“`

deviseを使用できるようにインストールします。

“`
$ rails g devise:install
“`

上記のコマンドを実行すると、ターミナルに下記の文字が表示されます。

“`
===============================================================================

Depending on your application’s configuration some manual setup may be required:

1. Ensure you have defined de

元記事を表示

OTHERカテゴリの最新記事