Rails関連のことを調べてみた2020年08月29日

Rails関連のことを調べてみた2020年08月29日

save!メソッド

フリマアプリを作成中、キーは取得できているのにデータが保存されない原因が分からなかった。メンターさんに質問したところ原因を探る方法を教えてくれたのでメモ。

# save/save!メソッドとは
データを保存するためのメソッド。

### saveメソッド
saveメソッドは、保存に成功したらtrueを、保存に失敗(バリデーションに失敗)したらfalseを返す。

### save!メソッド
save!メソッドは、保存に成功したらtrueを返すが、保存に失敗(バリデーションに失敗)したら例外が発生します。だから、保存できなかった場合の処理はrescue節で行う必要がある。

■私の場合、`binding.pry`を使用したところ、キーは取得できていたので、`@user.save!`を使って原因を探った。
↓保存できなかった時の記述

“`
[8] pry(#)> @user.save!
(0.2ms) BEGIN
↳ (pry):12
User Exists (13.4ms) SELECT 1 AS

元記事を表示

Railsのログ出力をカスタマイズする

RailsのログにプロセスIDを出すようにしたかったのでログ出力の変更方法を調べました。

## 独自フォーマッターの作成
標準ライブラリのフォーマッター(Logger::Formatter)を継承してcallメソッドを上書きします。

“`ruby:log_formatter.rb
class Logger::CustomFormatter < Logger::Formatter cattr_accessor(:datetime_format) { "%Y/%m/%d %H:%M:%S" } def call(severity, timestamp, _progname, msg) "[#{timestamp.strftime(datetime_format)}.#{format('%06d', timestamp.usec)}] (pid=#{$PROCESS_ID}) #{severity} -- : #{msg.class == String ? msg : msg.inspect}\n" end end ``` 今回は通常のログに加えて`(pid=#

元記事を表示

【Rails】エラー文が出ないのに、データが保存できない

初投稿です。間違えなどありましたら、ご指摘ください。
######エラーが出ないのに、データが保存できない
個人的によく引っかかるため、投稿します。
解決の参考にしてください。

######解決策
modelファイルにoptional: trueを追加(belongs_toのあと)
(デフォルトでは、references型のカラムが空で保存できないようになっているから?)

######前提
taskモデル(作業)と、start_timeモデル(開始時間)を作りました。
開始時間をつけずに、作業を保存します。
ちなみに、start_timeにはtask_idが保存されるようにします

“`
start_timeモデルのマイグレーションファイル

t.references :task

“`

保存できませんでした。

######修正した前と後

“`
task.rb
修正前

belongs_to :start_time

“`

“`
task.rb
修正後

belongs_to :start_time, optional: true

元記事を表示

optional: trueをつけるその前に!デバッグの一例

## 概要
「ActiveRecord::RecordInvalid: Validation failed: Users must exist」というエラーが出たので検索をしていると、正しくなさそうな「optional: true」を使用した回避策が散見されたのでデバッグの流れを中心に書いてみました。
学習し始めは、自分でデバッグしようにも**何をすればいいのか分からない!**ということが多かったので何かの参考になれば嬉しいです。

## エラーの発生状況と原因
### エラーの発生状況
[ミニブログにコメントをつけるアプリ](https://mini-blog-with-comment-unction.herokuapp.com/)を作っている最中にコメントの投稿をsaveすると、一見正しく見えるのにsaveがfalseになっていた。

### 原因
アソシエーションが正しくなかった。

“`ruby:user.rb
class User < ApplicationRecord has_many :blogs, dependent: :destroy end ``` ```r

元記事を表示

GraphQLで変数を用いたクエリを作成する方法【Ruby on Rails使用】

#はじめに
※本記事は
前回の記事「[RailsでGraphQL APIからデータを取得・表示する](https://qiita.com/hinokage/items/243b55477172317eb126 “Qiia”)」の追記内容です。
よろしければ前回の記事から読んでいただけると有り難いです(ダイレクトマーケティング

前回の記事で紹介したGraphQLのクエリの書き方において
「変数をクエリの中で使うにはどうすればいいの?」と疑問に持つ方がいらっしゃるかと思います。

私の場合は
REST APIで取得したデータをGraphQL APIに渡したかったので
どうすればクエリに変数を組み込めるんだろう?という疑問を持ちました。

で、「GraphQL クエリに変数渡す」とかググると
__やっぱり分かりやすい記事がヒットしない!__

というわけで今回も、初学者の方向けに分かりやすく(自分も初学者ですが…
GraphQLのクエリで変数を使う方法を解説しようと思います。

#静的なクエリ
今回は以下のクエリを例に説明します。

“`
query {
repositoryO

元記事を表示

【ruby】今夜、ループ処理まとめてみました【times, break…】

[前回](https://qiita.com/beanbeenzou/items/4c8534b8dc42a10220a9)は、配列に因んだ繰り返し処理など紹介しました。
今回は、配列もしかり。範囲オブジェクト等にも使うようなループ処理に着目して、まとめてみます。

#早見表

###繰り返し処理

|メソッド / 文法|繰り返し回数
|:–|:–
|for ~ in ~文|オブジェクトの要素分
|while文|指定した条件がtrueの間
|until文|指定した条件がfalseの間
|timesメソッド|任意に指定
|loopメソッド|無限

###繰り返し処理に関するテクニック

|文法|機能
|:–|:–
|next|スキップ
|redo|やり直し
|break|中断

#繰り返し回数を変化させるメソッド / 文法たち

##for ~ in ~
要素(範囲)の分だけ、繰り返す

“`ruby

for num in 1..5 do
p num
end
“`

“`console:戻り値
1
2
3
4
5
=> 1..5
“`

##while
条件

元記事を表示

Railsでlink_toを使ってボタン遷移を実装する

##概要
今回実装したいのは、以下の画像のようなボタンにlink_toメソッドでリンクを与える実装です。

![syuppinn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696517/82ac4946-1df3-e606-e9e0-22176c4bf6b1.png)

この’出品する’ボタンをクリックすると、与えた商品投稿ページのリンクへ遷移することができます。

##二通りのやり方がある
この機能の実装には二通りのやり方があります。
なぜlink_toの方が良いのかはわかりません…

・a href要素での記述

“`ruby:xxx.html.erb

出品の画像やテキストの記述

“`

・link_toでの記述

“`ruby:xxx.html.erb
<%= link_to("URL") do %>
 ここにHTMLのコードを記述する
<% end %>
“`

##例
今回の実装で記述したコードを参考例として貼っておきます。

“`rub

元記事を表示

AWSに画像をアップロードする

Heroku上で扱う画像ファイルなどは、アプリがデプロイされるか、
アプリが再起動(24時間に1回自動で行われる)される度に消えてしまう仕様です。

なので、アップロードされた画像を「AWS」というサービスに保存されるようにする事で
この問題を解決していきたいと思います。

#目次
①.AWSアカウントの作成
②.AWS上のセキュリティ対策
③.S3でバケット(保存先)を作成
④.画像がS3のバケットに保存されるように設定

それでは早速始めていきます!

##①AWSアカウントの作成

https://aws.amazon.com/jp/
にアクセスしてサインアップします。
注意点は、アカウントの種類は「パーソナル」を選択すること。
サポートプランは無料のベーシックプランでOK
ここまできたら、実際にサインインして確認します。

##②AWS上のセキュリティ対策
3つの設定を行います。

1.二段階認証の設定
2.IAMユーザーの作成
3.git-secretsの利用

###1.二段階認証の設定

Authyというアプリケーションを利用するので、
ますは「Authy」を自

元記事を表示

Rails で外部キー制約をつける際に別名をつける

“`ruby
class Test < ActiveRecord::Migration[5.2] def change add_reference :tags, :owner, foreign_key: { to_table: :users }, default: nil, null: true end end ``` ```ruby class Test < ActiveRecord::Migration[5.2] def up add_reference :tags, :owner, foreign_key: { to_table: :users }, default: nil, null: true end def down remove_reference :tags, :owner, foreign_key: { to_table: :users }, default: nil, null: true end end ``` `add_reference :tags, :owner` と指定した場合、カラム名は `own

元記事を表示

has_manyで、scopeを使って絞り込む

merge で scope を指定すればOK。

“`ruby:user.rb
has_many :team_members
has_many(
:pro_team_member,
-> { merge(Team.pro) },
through: :team_members,
source: :team,
)
“`

「何をもってproとするか」は、 `Team` 側が持つべき知識なので、 `User` 側で無闇に `where(pro: true)` みたいなコードを書くのは避けた方がよいです。

ドメイン知識が他のオブジェクトに流出している感じがするので。

元記事を表示

crud処理、deviseを使った製作物について(初心者向け)

#### わたしが今回投稿した理由
オンラインスクールで学んだことを活かして
その備忘録として今回執筆することにいたしました。
素人が書いているものなので、もし違っている内容があった場合はご容赦いただけると幸いです。
早速ですが、初めていきましょう。

# 開発環境
– rails 6
– データベース:postgresql(のちにherokuでデプロイさせたかったため)
– VSCode
– 今回はresourcesで使用
 (これを使用したらshow,destroy,update,edit,index等を一括で定義できます)

### コード
rails new 自分の作りたいアプリ名 -d postgresql
❇︎基本railsはSQLite3がデフォルトになっているので、-dとするとデータベースを指定することができる。

### そのあと実行すること
– 自分が作ったアプリ名のフォルダに戻るような感じにする
例)cd my_favorite

#### このあとrails db:createを実行
##### 自分で作ったアプリのフォルダをVSCodeにドロップしてあげる

元記事を表示

user devise ユーザー管理機能

ユーザー管理機能の手順

“`
gem ‘devise’

bundle install

rails g devise:install

rails g devise user
“`

元記事を表示

2つのdeviseを作成した時にdevise_parameter_sanitizerを個別に設定したい

####2つのdeviseを作成し、個別devise_parameter_sanitizerの設定をしたい時の手順を書きます。
オリジナルアプリケーション作成中です。

ruby ‘2.6.5’
rails ’6.0.0′

まず前提条件として各deviseの、ルーティング、モデル、コントローラー、ビューの設定ができている状態でスタートします。
上記作成方法は[こちら](https://qiita.com/kinpin/items/067eff7d2fbe74d85c83)を参考にしてください。

さて通常1つのアプリケーションに対して1つのdeviseであれば、application_controller.rbファイルにbefore_actionを使ってdevise_parameter_sanitizerの処理を行います。

app/controllers/application_controller.rb

“`ruby
class ApplicationController < ActionController::Base before_action :config

元記事を表示

データが余計に照合されて動作が重くなるN+1問題を解決したい

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

2.N+1問題とは何か

3.なぜN+1問題になるのか

4.N+1問題を解決する方法

1.結論
—————————————-
includesメソッドを使う!

2.N+1問題とは何か
—————————————-
アソシエーションをしている時に起こる問題です。
対策せずにアソシエーションを組むと
AデータベースとBデータベースが
一個一個全てを参照していくことをしてしまうため
処理が多くなってしまい動作が遅れてしまう問題です。

由来は、全てのレコードをまとめて1個+中身のレコードN個分ということでN+1となっています。

3.なぜN+1問題になるのか
—————————————-
例えば下記の例を見てみます。

“`ruby

元記事を表示

⚡️Blitz.js – React on Rails

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/bdc82b0b-a86f-23a7-7d60-21998fcbb407.png)

**⚡️Blitz.js** – Railsにインスパイアされて作られたフルスタックReactフレームワークです。

Reactエンジニア・JSエンジニアが少ないリソースでWEBサイトを構築するまでにはいくつもの選択が必要です。

使いやすいFormライブラリはどれだ、ORMはどれだ、ディレクトリ構成はどれだ、、などを決めなくてはいけません。
もちろん、これは自分で設計を行ってミニマムにアプリケーションを作るには適しています。

しかし、一方でRailsやLaravelのようにパワフルなフレームワークのおかげですぐに本質的な作業に入りたい方もいるでしょう。

そんな方にBlitz.jsをご紹介します。

https://github.com/blitz-js/blitz

## Introduction

なにはともあれ、サイトを構築してみ

元記事を表示

DockerでMysqlを使いたい

Dockerを初めてまだ日数が立っておらず、ハマったので、備忘録としてターミナルでMysqlに接続し、弄る方法を記述していく。

始めに、

“`
docker ps
“`

で、MysqlのコンテナIDを確認。

“`
name@mbp APP_NAME % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2acfbade0963 app_name_web “rails s -p 3000 -b …” 2 days ago Up 2 days 0.0.0.0:3000->3000/tcp app_name
c71b0bf50f29 mysql:5.6.47 “docker-entrypoint.s…” 2 days ago

元記事を表示

初心者がRuby on Railsでポートフォリオを作成しました

# はじめに

今回の内容は転職活動中で作成しているポートフォーリオの説明です。
アドンバイスなどがありましたらよろしくお願いします。

# 開発環境

– Ruby 2.6.3
– Rails 5.2.3
– DB:PostgreSQL 12.3
– AWS/EC2/S3
– Route53,ACM,ALBでSSL

# 背景

売れていないお笑い芸人は生活するために、バイトなどをしております。
芸人は、自分が出演するライブのチケット販売のノルマを課せられ、達成できない場合、給料から天引きされます。
給料が天引きされるて給料が入らなくなると、本来するべきである芸を磨くということがに時間を使えなくなり、バイト三昧と負のループに陥ってしまいます。

そこで芸人自身が出演するライブのチケットを売り切ることで収入が安定し、
芸を磨くことに当てる時間が増えるため芸人としてヒットする確率も上がると考えました。

現在、芸人の方々もSNSを駆使してライブの情報やチケット販売の広報などをしておりますが、
1つのプラットフォームにまとまっていないため、検索がしづらく、すでに芸人を知っている方はライブの

元記事を表示

RefineryCMSの導入【Ruby on Rails】

https://www.farend.co.jp/blog/2019/01/refinerycms/
をほぼパクった自分用メモ。OSはMacです。
[Refinery公式](https://www.refinerycms.com/guides/installation-prerequisites)のガイドを見ながらすると簡単。
# 実行環境
Rails 5.1.6.1
refinerycms 4.0

[Refinery公式](https://www.refinerycms.com/guides/installation-prerequisites)のガイドを見て自分の環境を確認してください。

## インストール・プロジェクト作成
### gemのインストール
$ gem install refinerycms

### プロジェクト作成

#### ターミナル

$ rails _5.1.6.1_ new プロジェクト名 -m https://www.refinerycms.com/t/4.0.0
RailsのVerを指定して作成

$ cd プロジェクト名

元記事を表示

Rails 4.2.x から 5.0.x にアップグレードする際にカナリアリリースすると session が取得できなくなる不具合を回避する

## はじめに

– カナリアリリースとは複数サーバのうちの一部にだけ新しいバージョンのアプリケーションをリリースするデプロイ手法である
– Rails 4.2.x から 5.0.x にアップグレードする際にカナリアリリースをする、つまり Rails 4.2.x と 5.0.x のアプリケーションが混在した環境を作ると session が取得できなくなる不具合が発生するのでこれを回避したい

この時世に Rails 5.0.x へのアップグレード(しかもカナリアリリースを挟んで)をする方がいらっしゃるのかは不明ですが、どなたかの役に立てば幸いです :pray:

Ruby や Rails をある程度触ってる方向けの内容なので、Rails における session や rack などの基礎的な説明は省きます。

## 解決方法

– rack gem のバージョンを `2.0.7` に固定する

## 原因を一言で

Rails 4.2.x -> 5.0.x のアップグレードに引きずられて rack gem が 2.0.8 以上にアップデートされるのが原因。(rack の 2.0.7

元記事を表示

[Ruby] 詳細ページなどに直接URLを入力されても他のページに遷移させる方法

初めての投稿なのでアドバイスあればよろしくお願いいたします!

フリマアプリ作成中、詳細ページまで作成してふと、
「これって直接詳細ページ飛べちゃうやん?」
と思い調べて自分なりにまとめてみました。

“`items_controller.rb
class ItemsController < ApplicationController before_action :set_item, only: [:show, :edit] def edit #重要なのはここから@itemは、before_actionからきてます if @item.user == current_user #current_userは、ログインしているユーザーのこと #@item.userは、@itemに入ってるuserを出してます render "edit" else #もし等しくなければ、redirect_toでroot_path(ホーム画面に戻っています) redirect_to root_path end private def

元記事を表示

OTHERカテゴリの最新記事