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

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

Ruby on Rails ログイン機能の実装(devise編)

###概要
gem’devise’を使ってログイン機能を実装する
パスワードとメアドでのログインではなく、名前とパスワードのログインに変える。

###今回の目標と自身の環境
– deviseを使用し、ログイン機能を実装
– 名前とパスワードでのログインに変更
– Ruby 2.7.0
– Rails 6.0.3.3

###実装
####準備
“`:Gemfile
#一番下に追加
gem ‘devise’
“`
Gemfileの編集後にターミナル以下のコマンドを実行

“`:ターミナル
bundle install
rails g devise:install
rails g devise User
rails db:migrate
“`
ただし、今回は名前でログインすると決めているので、rails db:migrateする前にマイグレーションファイルを編集する。

“`:db/migrate
#t.timestamps null: falseの上に追加
t.string :name
“`
####viewの作成
“`:ターミナル
rails g d

元記事を表示

Ruby on Rails ログイン機能の実装(Session編)

###概要
sessionを使用しログイン機能を実装する。
session(session[:user_id] = 1)の使い方を理解する 

###sessionとは
ステートフルな通信を実現するための仕組みのこと。

通常のブラウザ(ステートレス)の通信では、ページが変わるたびに前のページの情報は全て破棄されてしまう。
つまり、前のページでログインしても、次のページに遷移したときログインしていると言う情報が引き継がれないため、遷移するたびにログインが要求されることになる。(非常に不便)

そのため、前のページの情報を引き継ぐことが可能なステートフル通信を実現する必要がある。
具体的には、データをクッキー(cookie)に保存することでステートフルな通信を実現できる。

###今回の目標と自身の環境
gem “devise” を使用せずにログイン機能を作る

Ruby 2.6.3
Rails 6.0.3.3
gem “bcrypt” を使用(パスワードの暗号化のため)

###実装
####sign in(新規登録)機能の作成

“`:ターミナル
#

元記事を表示

【Rails6】Railsで背景画像を設定する方法【CSS】

地味にいつも忘れる&意外と正しい情報にたどり着くのに時間がかかったので、忘れないように備忘録として残しておきたい思います!
##Railsで背景画像を設定する方法①
画像ファイルをapp/assets/images配下に配置して以下のように記述するだけです。

“`scss:custom.scss
.background {
background-image: image-url(‘haikei_image.jpg’);
}
“`
こちらは直感的にかけるので僕はこっちが好きですね。

##Railsで背景画像を設定する方法②
こちらも同じように画像ファイルをapp/assets/images配下に配置して以下のように記述します。
①と違うのはファイル名をcustom.scss.erbとして、拡張子に.erbを付けることです。

“`erb:custom.scss.erb
.background {
background-image: url(“<%= asset_path('haikei_image.jpg') %>“);
}
“`
こちらでもうまくいったので最初はこち

元記事を表示

続・初見で難解だったdeviseを改めてまとめてみた

#はじめに
 前回の「初見で難解だったdeviseを改めてまとめてみた」の続き。今回はログアウト機能について。
deviseの導入について説明している、前回の投稿はこちら↓
https://qiita.com/TerToEer_sho/items/b5523ad100d08126a547

##ログアウト機能の実装
 
 そもそも、ログアウトのボタンは、ログインしているユーザーにしか必要がない。
 つまり、
ログイン状態であれば、ログアウトボタンを表示させる。
 また、ログインしている状態であれば、ログアウトボタンは必要ない。
 つまり、
ログインしていない状態であれば、ログインボタンを表示させる。

 では、どのようにして、ログインしているのかどうかを判断するのか。これもまた、deviseの優れたところで、deviseのGemをインストールすると使えるメソッドがある。

user_signed_in?メソッド

 日本語訳通り、サインインしているか

元記事を表示

Modelのインスタンスからカラム名を取得する

一覧画面作成時に表示用のキー名リストがあったらいいなと思い書いてみました。

#手順
## 1. Model作成

何かしらのModelを作成

“`ruby:models/user.rb
class User < ApplicationRecord include Table #ここでインクルードすると、インスタンスメソッドとして使える attribute :name attribute :email attribute :login_id attribute :password end ``` ## 2. Modelインスタンスからカラム名を取得するメソッドを作る ```ruby:models/concerns/table.rb module Table extend ActiveSupport::Concern # カラム名(シンボル)を配列で取得 def table_keys self.class.column_names.map(&:to_sym).reject { |column| %i[id created_at upda

元記事を表示

【Ruby】標準入力から値を取得する方法まとめ【Paizaスキルチェック対策】

#一行から値を取得する
“`
#========================================
パターン1 変数にgetsメソッドを入れ、putsで出力
#========================================
n = gets
puts n

#========================================
パターン2 stdinを使う方法
#========================================
puts $stdin.gets

“`

#複数行から要素を取得して出力

標準入力
2
4
7

“`
#========================================
パターン1
#========================================

#========================================
パターン2
#========================================
puts $stdin.

元記事を表示

RailsのKnockでJWTを手動生成する方法

jwtを作成してくれるgemであるknockを使って,iosとRails間の認証機能を作っていたのだが、
新規ユーザーの作成の成功と同時にログイン状態にしたいのだが、当初の新規ユーザー登録の流れは、

① user/createでユーザーを新規作成.
→ ユーザー情報を返す。

② そのユーザー情報をリクエストボディに入れて、user_tokenにpostリクエストを送りjwtを受け取りログイン状態にする。

と、二回APIを叩く必要があった。これをuser/createのレスポンスをjwtにすることで一回にしたい。

以下の様にした。

“`ruby:
def create
user = User.new(user_params)
if user.save
token = Knock::AuthToken.new payload: { sub: user.id }
render status: :created, json: token
else
render status: :unprocessable_entity, json:

元記事を表示

ActiveRecord単体を使ったTSVファイルからMySQLへのデータ移行(ヘッダー除去)

# はじめに
ActiveRecordを単体で使用して(railsなし)テキストファイルから、データベースへのデータ移行を行いました。今回はタブ区切り形式のデータファイル(TSVファイル)からデータを読み込み、MySQLのデータベースへ格納しました。

# 目次
0.完成コード
1.ActiveRecordのインストール
2.MySQLへの接続設定
3.クラス定義
4.データの読み込みとレコードの作成
 4-1.with_indexを用いて、ヘッダー部分を除去
 4-2.多重代入を用いたヘッダーの除去
5.プログラムを実行

# 0.完成コード
“`ruby:posts_to_mysql.rb
require ‘active_record’

# DB接続設定
ActiveRecord::Base.establish_connection(
adapter: ‘mysql2’,
host: ‘localhost’,
username: ‘root’,
database: ‘training’
)

# テーブルにアクセスするためのクラスを定義
c

元記事を表示

rails のアクセス制限

#種類
ログインしていないユーザーに対するアクセス制限
ログイン中のユーザーに対するアクセス制限
viewファイルへの記述

#具体的な手順

##ログインしていないユーザーに対するアクセス制限
コントローラーへ`before_action`を記述

“`***controller.rb
before_action :forbid_login_user, {only: [:top]}

#~その他の記述は省略~
def autheniticate_user
if @current_user.nil?
flash[:notice]=”ログインしてください”
redirect_to(“/URL”)
end
end
“`

##ログイン中のユーザーに対するアクセス制限
コントローラーへ`before_action`を記述

“`***controller.rb
before_action :forbid_login_user, {only: [:top]}

#~その他の記述は省略~

def fobid_login_user
if @current_us

元記事を表示

【環境構築】Rails + MySQL + Docker   (初心者も30分でOK!)

### Dockerを使った環境構築
「環境構築はコードを書くよりも難しい」と聞いたことがあります。

### Dockerは簡単!
何故かと言うと、、、
**コピペするだけ**でいいから
ただし、理解するまで少し時間がかかるかも、、、
まずは簡単な概要から

### Docker
仮想環境を構築するための道具

### コンテナ
仮想環境そのもの
(DockerはDockerエンジンの上にコンテナが動く)

### イメージ
Dockerコンテナを実行するために必要なもの。

### 環境構築の手順
①.“`プロジェクト(ディレクトリ)を作成し、移動する“`

$ mkdir アプリ名
$ cd アプリ名
②.“`Dockerfile、docker-compose.yml、Gemfile、Gemfile.lockを作成する“`

$ touch Dockerfile docker-compose.yml Gemfile Gemfile.lock
③.“`エディタを開き、Dockerfile、docker-compose.yml、Gemfileを下記か

元記事を表示

ac-library-rb で解く AtCoder UnionFind(DSU)

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
*[AtCoder Beginner Contest C – Connect Cities](https://atcoder.jp/contests/abl/tasks/abl_c)*
Difficulty: 363

*[AtCoder Beginner Contest D – Friends](https://atcoder.jp/contests/abc177/tasks/abc177_d)*
Difficulty: 676

今回のテーマ、UnionFind

*[ac-library-rb](https://github.com/universato/ac-library-rb

元記事を表示

VSCodeで作業する時に、erbでhtmlタグの自動生成機能を有効にする

## はじめに
erbで、htmlタグを自動生成する機能を使えるようにするにはどうしたらいいのかについて簡単に説明しています。

プログラミングはじめたての頃、
「htmlで自動でタグが自動で生成されていたのに、erbで開発で開発するようになったら今までのようにならない。」と言う経験があったので、解決方法をまとめてみました。

## 手順

### Rubyの拡張機能を入れる。
railsで開発していれば入っているかと思いますが、確認です。

### setting.jsonを開く
commnad+shift+pを押して、`setting.json`と検索して、setting.jsonを開きます。
こんな感じのファイルです。

“`ruby:setting.json
{
“editor.tabSize”: 2,
“editor.renderWhitespace”: “all”,
“files.autoSave”: “onFocusChange”,
“explorer.confirmDragAndDrop”: false,
“window.zoo

元記事を表示

ruby,railsでプログラミングはじめたての時に、効率よく学ぶためのVScode拡張機能

## はじめに
**VSCodeにはタグを自動で生成してくれる便利な拡張機能があります。**
こう言うことをきちんと知って始めないともったい。
と言うのも、知らずに効率の悪い作業を続けてきたので、とりあえず入れたらいいんじゃないかと思う拡張機能をまとめました。

## コードを印刷する
### PrintCode
コードを印刷できる。
ブラウザで印刷画面が開き、印刷することができる。
細かい設定はできません。
紙でコードをすぐに参照できるようにしておくと、勉強したてのころは結構よかったりしました。

## タグ入力
### Ruby
コードを見やすく色付けしてくれたりするなどの基本機能が入ったものです。

### Auto Close Tag
HTMLのタグを`div`と打ってtabキーを押すなりすれば、自動で`

`と変換されます。
気をつけたいのが、erbだと動きません。
対処は、「[erbでhtmlタグの自動生成機能を有効にする](https://qiita.com/Tigris3313/items/3e79f4d9f592f80fac67 “erbでhtmlタ

元記事を表示

rails g scaffoldの使い方、機能、注意点

#scaffoldとは
一言で言えば、必要なファイルをすべて作成し、DBも含めたルーティングも済ませてくれるコマンド。

#生成方法

“`
$rails g scaffold モデル名 カラム名1:データ型 カラム名2:データ型 ….
“`

###生成されるファイル
モデル
マイグレーションファイル
コントローラー
ビュー
ルーティング

##生成されたファイルの中身
仮に`usersinfo`というモデル名で`nameカラムageカラム`を生成した場合。

“`
$rails g scaffold usersinfo name:string age:integer
“`

####モデル
特別な記述はないので省略。

####マイグレーションファイル

“`*******_*******.rb
class CreateUsersinfos < ActiveRecord::Migration[5.1] def change create_table :usersinfos do |t| t.string :name #生成時に指定したカラム

元記事を表示

【Ruby on Rails】更新日、作成日を好みの表記に変更する

# 目標
デフォルトの表記ではなく、
2020年09月◯◯日や2020/09/◯◯
11時05分や11:05と変更する

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 流れ
1 gem ‘rails-i18n’を導入
2 config/application.rbを編集
3 viewを変更

# gem ‘rails-i18n’を導入
“`rb:Gemfile
gem ‘rails-i18n’
“`
“`:ターミナル
$ bundle install
“`
# config/application.rbを編集
config.load_defaults以下4行を追記。

“`rb:config/application.rb
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 5.2

元記事を表示

任意の3つの数字を、同じ値を除外して合計を出力する方法

【概要】
—————————————-
1.結論

2.どのようにコーディングするのか

1.結論
—————————————-
配列、eachメソッド、if文を使う!

2.どのようにコーディングするのか
—————————————-

“`ruby
def any_three_sum(array)
unique_nums = [] #—❶
array.each do |num| #—❷
count = 0
array.each do |i| #—❸
if num == i
count += 1
end
end
if count < 2 #---❹ unique_nums << num end end three_sum = 0 #---❺ u

元記事を表示

[Ruby on Rails]「〜を満たすまでループする」をやめる

#なぜ書くのか
実務スタートしてから本日でまる1ヶ月が経ちました。
同期と協力し、一つの機能をリリースし、正常に稼働させることに成功しました。
しかし実は一度、本番環境で処理を完了できないという不具合を起こしてしまいました。
2度と同じことを起こさないための備忘録としアウトプットさせていただきます。

#なぜ起きたのか
簡単に言えば「無限ループ」に陥ったことが原因です。
Sidekiq上で走っているジョブを監視するという機能で、ジョブがダブったり喪失したりするのを検知しSlackにアラートを出すというのが、今回の実装内容でした。

まずぶち当たったのが、
・予定から実行
・実行中から予定
この双方の行き来のタイミングでジョブを取得してチェックに入ってしまうと、度々エラーとして検知してしまうということです。

行き来のスピードは1秒から最大5秒ほどのラグがありました(ローカル環境でのチェックでは)。
そのタイミングで新機能の監視用のジョブが動いてしまうと、正常にジョブが動いていたとしてもエラーとして検知してしまうということです。

これに対し私が行った対策は
**ジョブを取得する際にル

元記事を表示

CodeWarでの勉強(ruby)⑥ inject

##この記事について
最近始めたCodewarを通じて学べたことを少しずつアウトプット

##問題
>If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Finish the solution so that it returns the sum of all the multiples of 3 or 5 below the number passed in.
Note: If the number is a multiple of both 3 and 5, only count it once. Also, if a number is negative, return 0(for languages that do have them)

10未満の数字の内で3と5の倍数の数字を合計して、その値を返すメソッドを作成する。
注意点が数が3と5の両方の倍数である場合(15

元記事を表示

【No.004】発注者の注文一覧画面を修正

[Issue](https://github.com/fukadashigeru/import_agent_app/issues/9)
[PR](https://github.com/fukadashigeru/import_agent_app/pull/10)

# 概要
発注者の注文一覧画面を修正する

# ToDoリスト
– [x] ステータスのenum化
– [x] 編集ボタンをfontawsomeに
– [x] 横幅が狭い時に横スクロールを可能に

# ToDo詳細
## ステータスのenum化

[Rails 国際化 (i18n) API](https://railsguides.jp/i18n.html)
[[初学者]Railsのi18nによる日本語化対応](https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5)
[Railsでi18nを使った日本語化をする](https://qiita.com/rearail/items/5554fab137ef8635a1af)

“`ruby:config/applicati

元記事を表示

「もっとプログラム脳を鍛える数学パズル」_Q39 (code:Ruby) -> Rust

[「もっとプログラマ脳を鍛える数学パズル」](https://www.shoeisha.co.jp/book/detail/9784798153612)をRustで書き直すのは、ボケ防止にちょうど良いかもしれない、と思った。

# Q39:隣り合うと消えちゃうんです

中級問題。このくらいになると、解答コードが何やってるのかも考えないと、分からなくなる。

## Ruby

“`ruby:q39_1.rb
N = 11

@memo = {[0,0,0] => 1}
def pair(unused, onetime, neighbor)
if @memo[[unused, onetime, neighbor]]
return @memo[[unused, onetime, neighbor]]
end
cnt = 0
if unused > 0
cnt += pair(unused – 1, onetime + neighbor, 1)
end
if onetime > 0
cnt +=

元記事を表示

OTHERカテゴリの最新記事