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

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

ActiveHashについて

オリジナルアプリ作成中に、ActiveHashを導入し実装したので
忘れないため記事にしたいと思います。

## ActiveHashとは?

まず、ActiveHashとは、変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。
例えば、都道府県などは変更されることはありませんよね。
そういったデータをデータベースではなくモデルで管理しようというものです。

私の開発したオリジナルアプリの部分ですと下記の画像の部分になります。
[![Image from Gyazo](https://i.gyazo.com/6b5067f8bacc5a7bafbcec7a6482cd93.gif)](https://gyazo.com/6b5067f8bacc5a7bafbcec7a6482cd93)

「文章問題」と「写真にタイトルをつけてください」の部分をActiveHashを使用しました。

## 導入の仕方

まずは、gemfileに下記を記述します

Gemfile

“`
gem ‘active_hash’
“`

元記事を表示

Railsでupdate_allとストロングパラメーターを併用した際のエラー対処

# 状況
railsの`update_all`メソッドとストロングパラメーターを併用して、SQLの発行回数を減らしてデータを一括更新したい。

# パラメーター
“`
Parameters: {“update_ids”=>[“1”, “2”, “3”], “group_id”=>”2”}
“`
update_idsで取得した複数のアイテムの属するグループIDを一括で変更したい。

# 該当コード
“`Ruby:items_controller.rb
def update
ids = params[:update_ids]
Items.where(id: ids).update_all(update_params)
end

private

def update_params
params.permit(:group_id)
end
“`

もちろん今回のような単純なケースだとストロングパラメーターを使用する必要はなく、

“`Ruby:items_controller.rb
def update
ids = params[:update_ids]
Ite

元記事を表示

アプリ開発実践入門6 Modelとデータベース SQL編

今日の教科書

#データベースの設定
##database.yml
configの中のdatabase.ymlファイルがデータベースの設定ファイルです。
YAMLファイルはデータをテキストで表すフォーマットでインデントでデータを構造的に記述している。

“`
default: &default
設定
development:
設定
test:
設定
production:
設定
“`

`default`:全てに共通する設定
`development`:開発時の設定
`test`:テスト用の設定
`production`:リリース時の設定

###主な設定の項目

`adapter`:データベースアクセスに使われるプログラムの一種。それぞれのデータベースごとにある。名前を使いたいデータベース用のものに変更して使う。

`pool`:データベースにアクセスするためのもので5とすると最大5ユーザーが同時にデータベースにアクセスできる。

`timeout`:データベースの結果を受け取るまでの最大の待ち時間。サーバ型だと、サーバーに問い合わせてから結果を受け取る。その際どれくらい待たされ

元記事を表示

RailsにTailwindCSSを導入

# はじめに
今回はRailsアプリにTailwindを導入するための手順を書いていきます。
[こちらの記事](https://davidteren.medium.com/tailwindcss-2-0-with-rails-6-1-postcss-8-0-9645e235892d)の手順に沿って進めていきます。

# バージョン
紹介した記事の中ではそれぞれ

“`
ruby 3.0.0
rails 6.1
“`

以上のバージョンで構成されています。が
私の環境は

“`
ruby 2.6.6
rails 6.1.3
“`

といった感じで記事の通りのバージョンではないのですが、この環境でも概ね記事の通りにすすめることが出来ました。(エラーはあったものの)
ですので、少なくとも私の環境のバージョン以上であれば問題なく導入できるかと思います。

## 導入手順
記事の中では新しいアプリケーションを作成するところから触れられていますが、
私は既存のアプリケーションに導入しましたので最初の方の手順は少し省きます。

元記事を表示

【Rails】 レビュー投稿は1度までに制限する方法

はじめに

先日口コミサイトのレビュー機能を実装していた際に、一人のユーザーが何度もレビューの投稿を出来ては困る、どうしたら良いのだろうかと悩んだことがありましたので、自身の備忘録として記事に残しておきたいと思います。

テーブル同士の関係性

※今回の記事に必要な最低限のテーブルのみ掲載しております。
スクリーンショット 2021-02-22 22.42.58.png

モデル

reviewモデルには、評価の値の空を禁止すること、1以上5未満(5段回評価のため)で評価しなければならない、というバリデーションを設定しております。

“`review.rb
class Review < ApplicationRecord belongs_to :member be

元記事を表示

[Ruby on Rails] WebpackerでjQueryを管理する方法

今回は、**jQuery**のインストール方法について備忘録を書いていきます。

**jQuery**は、JavaScriptを簡易的に記述できるライブラリで、今でも根強い人気を持つものです。
ライブラリを導入するためには、事前の設定がいくつか必要です。

まずはコマンドを実行しjQueryをインストールしていきます。

#% yarn add jquery

jQueryの導入には、jquery-railsというGemを利用することもありますが、今回のように**Webpacker**で管理する際は、Node.jsのパッケージを利用します。

 

yarnコマンドを実行した後は
**webpackの管理下に追加する記述**を追加で書いていきます。

“`config/webpack/environment.js
const { environment } = require(‘@rails/webpacker’)

const webpack = require(‘webpack’)
environment.plugins.prepend(‘Provide’,
new we

元記事を表示

deviseでメールアドレスとパスワード以外をDBに保存する方法

#ユーザーの名前をDBに保存する方法
deviseではDBに保存できるカラムが決まっています。なので他のカラム情報をDBに保存する際は、ストロングパラメーターの設定が必要です。
設定はapp/controllers/application_controller.rbに記述します。
※deviseのコントローラーの処理を記述する時は、application_controller.rbに記述すると良いです。

“`app/controllers/application_controller.rb
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) end ``` 上記

元記事を表示

【Rails】コントローラー内の記述をメソッド化してモデルに定義 ← 1人のユーザーの全投稿に紐づくイイね数表示

## 概要
下記記事を参考に作成したコントローラー内のロジックを
何度も記述しておりましたのでリファクタリングのため、
メソッド化してモデルに定義しました。
その際、インスタンスメゾッド?クラスメゾッド?なにそれ…!となりましたので
ざっくり理解した内容と合わせて記事にしました。

参考:[【Rails】ユーザー1人の全ての投稿に紐づく「イイね」の合計数を表示する方法](https://yumanoblog.com/rails-likes/)
参考:[【Ruby】クラスメソッドとインスタンスメソッドについてザクッと分かりやすく説明してみる](https://qiita.com/hogeta_/items/27221675638cdc9bde6b)
参考:[Railsのモデルに書いたメソッドってどうやってコントローラで使うの?](https://qiita.com/leavescomic1/items/99f32f45cd04035f146c)

## 元の記述
一部カットしていますが、今回モデルに移す
『userが持つ全投稿のいいね合計を算出するロジック』はこのように記述しています。

元記事を表示

Rails6にBootstrapを導入してトップページを作成する

Rails6でアプリケーションにBootstrapを導入した際の手順をまとめてみました。
###### 完成形
![cook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1140333/f8c0aa10-2606-0b9d-8876-888500ea432f.jpeg)
Bootstrapの導入までは以下をコピペ

##Bootstrapの導入

##### jQuery、Bootstrap、popper.jsの導入
“`:ターミナル
yarn add jquery bootstrap popper.js
“`
##### webpackの設定
“`javascript:config/webpack/environment.js
const { environment } = require(‘@rails/webpacker’)

//ここから
const webpack = require(‘webpack’)
environment.plugins.append(
‘Provide’,

元記事を表示

railsでpostgresqlを使うと2度目の投稿データ編集時に、1回目の編集データが下段にずれる

先日ポートフォリオを作成時に編集データが下段にずれてしまい、困ったため備忘録として投稿します。
これだけではなんのことかわからないと思うので内容をご確認ください!

#アソシエーション
![スクリーンショット 2021-02-22 20.37.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036177/886b0af1-c6c0-87c9-7095-2711e236198e.png)
#コントローラー
“`cooks_controller.rb
def new
@cook = Cook.new
8.times { @cook.materials.build }
end
“`
このような形で新規投稿時に、食材と分量を最大8種類入れることができるようにしています。

#ビュー
“`_cook_form.html.slim
div.cook-post-container
div.col-12
= form_with model: cook, loca

元記事を表示

[memo]deviseの導入方法

##deviseの導入手順

“`
# Gemfile
% gem ‘devise’

#ターミナル
% bundle install

# deviseの設定ファイルを作成
% rails g devise:install

# deviseコマンドでUserモデルを作成
% rails g devise user

# テーブルの設計を確認しマイグレーションファイルへ追記
% rails db:migrate
“`

deviseでログイン機能を実装すると、ログイン/サインアップ画面が自動的に生成されますがビューファイルとしては生成されません。
これは、deviseのGem内に存在するビューファイルを読み込んでいるためです。

deviseのビューファイルに変更を加えるためには、deviseのコマンドを利用して、ビューファイルを生成する必要があります。

“`
# deviseのコマンドで、devise用のビューファイルを生成
# deviseに用意されたビューファイルをコピーし、app/viewsの配下に配置してくれるコマンド
% rails g devise:views

元記事を表示

[memo]ログインしているかどうかの判定

##user_signed_in?メソッド
ログインしているかどうかの判定を行うdeviseのメソッド

例:viewでログインしているときとそうでないときで表示を分ける場合に使う

“`:app/views/layouts/application.html.erb
<% if user_signed_in? %>
 

  <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
  <%= link_to "投稿する", new_tweet_path, class: "post" %>
 

<% else %>
 

  <%= link_to "ログイン", new_user_session_path, class: "post" %>
  <%= link_to "新規登録", new_user_registration_path, class: "post" %>
 

<% end

元記事を表示

【circleCI】を使って、githubと連携させ、テストを自動化する

##初めに
転職に向けてPF作成中。そんな中、circleCI で良い方法を見つけたので共有。

##環境
macOS
ruby2.6.6
rails6.1.3
Docker20.10.2

##背景
circleCIを自分のPFに導入しようとしてDocker入門を頼りに進めていたところ、
どうしても行き詰まり、何か良い方法はないかと検索していた。
そこで、Docker-composeとcircleCIを連携させている記事に出会い、
無事に導入出来たので紹介したくなりました。

##結論

“`config.yml

version: 2
jobs:
build:
#Docker-composeが仮想済のマシーンをpull
machine:
image: circleci/classic:edge #最新のDocker環境で使えるようになる
steps:
– checkout
– run:
name: Dockerコンテナのビルド
command: docker-compose b

元記事を表示

Formオブジェクトパターン

1つのフォームから送信したデータを複数のテーブルへ分けて保存する方法をFormオブジェクトパターンを使用して実装していきましょう。

## プロジェクト作成

“`console:
# 「investment_app」という名前で、Railsバージョン “6.0.0” で作成
% rails _6.0.0_ new investment_app -d mysql

# investment_appディレクトリに移動
% cd investment_app

# investment_appのDBを作成
% rails db:create
“`

## ルーティングを設定

“`rb:
Rails.application.routes.draw do
root “investments#index”
resources :investments, only: [:index, :new, :create]
end
“`

## has_one
アソシエーションが1対1の時に使われる、アソシエーションを定義するためのメソッドで,親モデル側に「has_one」を、子モデル側

元記事を表示

【ruby】CSVファイル読み込み時に1列目のデータが読み込めない時の対応

初期投入用のDB登録処理を作成した際、CSVファイルを読み込んでデータを登録するようにしたのですが、1列目に登録していたデータを読み込めない現象が発生しました。
対応方法を調査した時によく見かけたBOMの有無の確認方法が、CSVだとうまく確認できないようなので、備忘として残します。

# 環境
macOS Big Sur 11.0.1
ruby 2.7.2

# 現象
以下のようなCSVファイルを、

“`csv:food.csv
id,category,name
1,北京料理,北京ダック
2,北京料理,杏仁豆腐
3,北京料理,炸醤麺
“`

以下の処理で読み込ませようとしたとき、1列目である`id`列が読み込めず、nilとなってしまう。
※データ取得時にヘッダ名を指定したときのみ。indexで指定すると問題なく登録できる。

“`rb:
require ‘csv’

CSV.foreach(“food.csv”, encoding: ‘UTF-8’, headers: :first_row) do |row|
Food.seed(:id) do |s|
s.id =

元記事を表示

学び直し Rubyがミニツク Part8

今日の教科書
[継承](http://www.minituku.net/courses/566428009/contents/43567039.html)

#継承
すでに定義されているクラスから機能を引き継いで新しいクラスを作ること。
作るときにスーパークラス(親クラス)となるクラスを指定すると継承できる。

“`
class サブクラス < スーパークラス 本体 end ``` 継承で新しく作られたクラスをサブクラス、継承元のクラスをスーパークラスと呼ぶ。 スーパーにできるのは一つだけ! ``` class Foo def foo puts("foo") end end class Bar < Foo def bar puts("bar") end end bar = Bar.new bar.foo #=> foo
bar.bar #=> bar
“`

継承によってサブクラスができること
– スーパーの機能を全て使用でき、新しい機能を追加
– スーパーの機能を上書きして、同じ名前のメソッドを作れる
– スーパーの機能を呼

元記事を表示

Herokuにデプロイした時のエラーについての備忘録

**Herokuにデプロイした際に出たエラーとその解決策について復習も兼ねて解説したいと思います。**

まず`git push heroku master`をした後に`heroku run rails db:migrate`をしてサイトにアクセスしたら以下のようなよく見るエラー文が表示されました。
Image from Gyazo
そこで`heroku logs –tail –app 【アプリケーション名】`でログを確認してみました。

“`
ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: relation “posts” does not exist
“`
確認した所、上記のエラーメッセージが見つかりま

元記事を表示

【初投稿】リセットCSSを書き記す

昨日から初めての`WEB開発`をスタートさせました!
にしても初めてはわからないことばかり、、、、

今回はリセットCSSを設定し忘れ、意味不明なCSSが反映されている方向けに
コピペで使えるリセットCSSを書き記したいと思います。

**▼リセット!**

“`
*{
margin: 0;
padding: 0;
}
html{
font-size: 16px;
}
body {
font-family: Verdana, “ヒラギノ角ゴ ProN W3”, “Hiragino Kaku Gothic ProN”, “メイリオ”, Meiryo, sans-serif;
}
header, footer, nav, menu, article, aside, section, details, figcaption, figure{
display: block;
}
ul, ol {
list-style: none;
}
table {
border-collapse: collapse;
}
img {
vertical-align: bottom;
}
a img {
bo

元記事を表示

Rubyで時系列予測〜prophet〜

自分で使うにあたって、頭の整理も兼ねて記事にしました。

## rubyで時系列予測がしたい!
– 全部rubyでやりたい
– railsで動かしてるシステムの中で予測値を出したい
– pythonやRなどでいいライブラリはいっぱいあるが、railsとのつなぎこみが面倒臭い
– スプレッドシートのTREND関数などもあるけど、やっぱりrailsとのつなぎこみが面倒臭い
– 全部rubyでやりたい

## prophetを使おう
prophet-rbというgemを使います。
https://github.com/ankane/prophet

元はfacebook/prophet(https://github.com/facebook/prophet )。これを移植してきたもの。

– 複数の季節性
– 線形/非線形成長
– 祝日など特別な日のハンドリング
– 欠損値処理
などをいい感じにやってくれる。

## インストール
Gemfileに以下の行を追記。

“`
gem ‘prophet-rb’
“`

## まずは試しに
{ 時系列: 実績値 }のハッシュを用意します。

元記事を表示

【Rails】定数を定義したらとりあえず freeze しておく

## はじめに

~~~ruby:
# 定数を定義した例
ARASHI_MEMBERS = [‘大野’, ‘松本’, ‘二宮’, ‘桜井’, ‘相葉’].freeze
~~~

上記のように Rails で定義した定数は基本的に freeze しておくのがベストです。

不用意に変更されることを防げます。

freeze しておくと、もし `ARASHI_MEMBERS` に破壊的な変更が行われようとした時に FrozenError を起こしてくれます。

~~~irb:
irb(main):001:0> ARASHI_MEMBERS << '木村' Traceback (most recent call last): 4: from /Users/dan/.rbenv/versions/2.7.1/bin/irb:23:in `


3: from /Users/dan/.rbenv/versions/2.7.1/bin/irb:23:in `load’
2: from /Users/dan/.rbenv/versions/2

元記事を表示

OTHERカテゴリの最新記事