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

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

数字の範囲を絞って入力を制限したい

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

2.どのように使うのか

3.補足

1.結論
—————————————-
validates_inclusion_of :(カラム名), in:(数字)..(数字) を使う!

2.どのように使うのか
—————————————-
バリデーションの数字の範囲指定になります!

“`ruby:models
validates_inclusion_of :
“`
の”:(コロン)以降”はmigarteフォルダやDBのカラムで設定している任意の名前をいれます!記載する場所はmodelsの任意のフォルダ名になります!

“`ruby:models
in:..
“`
の部分は”..”の前後に範囲にしたい数字を入れます!

例えば100から2000であれば

“`ruby:models
val

元記事を表示

Rails5+Docker環境におけるActicerecord関連付け後マイグレーションのエラー

### クリニックとそこに勤務するスタッフのDB作成と関連付けを行う。
rails 5系
ruby 2.4.5
Docker
下記環境

“`Dockerfile
FROM ruby:2.4.5
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
“`

“`Docker-compose.yml
version: ‘3’
services:
web:
build: .
command: bundle exec rails s -p 3000 -b ‘0.0.0.0’
volumes:
– .:/app
ports:
– 3000:3000
depends_on:
– db

元記事を表示

Rails.Rspecにおける click_on find().clickなどの使い分け

テストコードの話になります。

“`ruby
find().click
“`
と言われるコードが出てきます。

これは検証ツールを使い
クリックしたい場所のinput要素とname属性を探して
()の中に書きます

“`ruby
find(‘input[name=“commit”]’).click
“`

これを入力することで
そのページのこの要素を持つボタンやリンクをclick
してくれるって書いてます。

つまり…
クリックしたい要素を!
その場所まで飛んで!
検証ツールで探して!
見つけたらそれを入力して!
って書いてます。

ご安心ください。
簡単なコード!
ご用意しました。

クリックしたいものがボタンの場合

“`


form_with内の
<%= f.submit "送信" %=>
“`
こんな形の場合。

“`
click_button ‘ボタンの表示名’
“`
これを使います。 
押したいボタンの名前は「送信」なので

“`
click_butt

元記事を表示

kaminariを使ったページネーションの実装

備忘録です!

##kaminariのインストール

まずは、kaminariをインストール

“`
gem ‘kaminari’
“`
bundle installします。

##controllerの設定

“`
def index
@board = Board.all.includes(:user).order(created_at: :desc).page(params[:page])
“`

・1ページあたりの表示件数は何件にするか(perメソッドを使用)
・何ページ目を表示させるのか(pageメソッドを使用)

これらをコントローラーで設定できます。

*今回は、別の専用ファイルで、perメソッドを設定していません。

ちなみに、kaminariは配列に対しても使用可能で、

“`
def index
@board = Board.all.includes(:user).order(created_at: :desc)
@board = Kaminari.paginate_array(@board).page(params[:page]).per(20

元記事を表示

Active Hashの落とし穴

##概要

今回、Active Hashに格納したデータを商品編集で呼び出す際に落とし穴にハマってしまったので共有しておきます。

qiita内を色々と検索かけてみましたが、なかなか解決せず、沼ってしまいました、、、

##実装内容

一度あらゆるデータを登録して出品したitemに、editアクションで編集する機能を実装します。

ポイントは、編集画面に遷移したら元々登録してあったデータがリセットされずに登録されていることです。

うまくビューファイルの呼び出し記述やモデルのアソシエーションの結びつけをできていれば問題ないのですが、しっかりエラーしまくりました。

##解決方法

先に解決方法から言っておきます。

今回のような機能を実装する場合、Active Hashにあるデータのカラム名は
**xxx_id**
としましょう。

例えばカテゴリーや配送元の都道府県などは固定のデータなのでActive Hashに記述します。ここで、itemのカラムと紐づける場合、しっかりとcategory_idやprefecture_idとしましょう。

逆にモデルでアソシエーションを組む際は、
b

元記事を表示

ヘルパーメソッドで条件分岐をする

##概要

今回は、ビューファイルを記述していく際に、ヘルパーメソッドを用いて条件分岐していく実装について書いていきたいと思います。

具体的には、
フリマアプリなどで「商品が購入されていない時」にはこの部分の表示がしたい。
だったり、
「ユーザーがログインしていない時」はこの表示は隠しておきたい。
と言ったような機能を実装します。

##例

“`ruby:xxx.html.erb
<% if user_signed_in? && current_user.id == @product.user_id %>
“`

これは、記述以下の部分を
「ユーザーがログインしている状態かつ、そのユーザーがこの商品を出品したユーザーだった場合のみ」
表示する記述です。

“`ruby:xxx.html.erb
<% if @item.item_purchase.present? %>
“`

これは、記述以下の部分を
「@itemのitem_purchaseカラムにデータが存在する場合のみ」
表示する記述です。

ここに書いただけでなく、様々な実装があるとは思いますが、作業した内容とし

元記事を表示

Railsで「いいね!」機能を作る – ②「いいね!」のcreateアクション

### 背景
Twitterのようなアプリを作っていて、投稿に「いいね!」ボタンを付けようと思います。
作ろうとしているもののデータベース構造はこんな感じです。

▼ER図
[![Image from Gyazo](https://i.gyazo.com/fcef6fe2644d5ddbf2275841de1d7ca0.png)](https://gyazo.com/fcef6fe2644d5ddbf2275841de1d7ca0)

作ろうとしている画面の参考画像はこちらです
▼画像イメージ
[![Image from Gyazo](https://i.gyazo.com/3af335cfe1a45eee10df6ef54b24bc3e.png)](https://gyazo.com/3af335cfe1a45eee10df6ef54b24bc3e)

この「いいね!」ボタンを押すと、ユーザーが投稿に「いいね!」でき、もう一度ボタンを押すと「いいね!」が解除できるようにしたいです。

モデル間のアソシエーションの設定は、過去にこの記事で行ってきました。

▼アソシエーションの設定

元記事を表示

【RubyonRails】外部キー制約のついたカラムを追加する

##はじめに
環境
– Ruby 2.6.3
– MySQL5.7

##やりたいこと
旅館のオフィス活用マッチングを作成中
ユーザーがホテルをお気に入り登録できるようにしたい
なお、hotel_favoriteはモデル作成済み。

##方法
hotel_favoriteモデルに、user_idとhotel_idを持たせたい。
(user_idは関連付け済み)

##やったこと

“`
rails g migration AddhotelidTohotel_favorites
“`
→XXXXXXX_add_hotel_ref_tohotel_favorites.rbが作られた。
以下の通り編集しました。

“`XXXXXXX_add_hotel_ref_tohotel_favorites.rb
class AddHotelRefTohotelFavorites < ActiveRecord::Migration[6.0] def change add_reference :hotel_favorites, :hotel, null: false, foreign_k

元記事を表示

disabledは簡単に外せる

[先日公開したアプリ](https://qiita.com/nizi24/items/d12e9642b9774670a6ae)に問題が見つかり、解決したので状況を共有します。

# ボタンの無効化は解除できる

下のようにゲストアカウントのプロフィールは変更できないように、ボタンにdisabledを付けていたのですが、

![スクリーンショット 2020-08-31 17.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651979/5f2b206b-381b-2341-ba49-c6b12d1d380d.png)

デベロッパーツールを使ってdisabledを消すと、

![recording (1) (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651979/ef1b0ef7-74e5-91d7-2e7f-11a9ea6f0ad8.gif)

ボタンの無効化が解除

In Gemfile: mysql2 エラーへの対応。

## エラー全体
> /private/var/folders/xt/149l2dks7ns2rz9j6ytm7m8c0000gn/T/bundler20200804-35301-1kchfhimysql2-0.5.3/gems/mysql2-0.5.3/ext/mysql2
make “DESTDIR=”
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: warning: directory not found for option
‘-L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.Internal.sdk/usr/local/lib’
ld: library not found for -ls

Ruby on Rails 6にforeman導入メモ

## gem導入

“`ruby:Gemfile
gem ‘foreman’, group: :development
“`

## Procfile.devを実行するbin/server作成

“`bin/server
#!/bin/bash -i
bundle install
bundle exec foreman start -f Procfile.dev
“`

## コマンドを実行するProcfile.dev作成

“`Procfile.dev
web: /bin/sh -c “rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b ‘0.0.0.0’”
webpacker: ./bin/webpack-dev-server
“`

## bin/serverの権限変更

“`
chmod 777 bin/server
“`

## サーバースタート

“`
bin/server
“`

Railsのactionのfiter(before_actionとか)で沼にハマった

– 20分くらいハマった。

## やったこと

– それぞれのfilterにかかった時間を図るために、`print_start_time`と`print_end_time`を複数回呼び出す設定にしようとした。

“`rb:my_controller.rb
class MyController < ApplicationController before_action :set_current_time before_action :action1 before_action :print_elapsed_time before_action :set_current_time before_action :action2 before_action :print_elapsed_time def print_start_time puts('######') puts(Time.now) end def print_end_time puts(Time.now) puts('......') end

`find_spec_for_exe’: can’t find gem railties (>= 0.a) with executable rails (Gem::GemNotFoundException)が発生した時

##1.エラーの発生

久々に自宅のPCでrailsプロジェクトを作成しようとした際に、下記のエラーに遭遇した。
だいぶ前にクリーンインストール等

“`
find_spec_for_exe’: can’t find gem railties (>= 0.a) with executable rails (Gem::GemNotFoundException)
“`

`rails new`も`rails -v`も全て同じエラーが出てしまい、rails関係のコマンドが一切使えない。

##2.試したこと
①bundlerのバージョンの問題と想定

“`
$ rbenv exec gem install bundler
$ rbenv rehash
“`
こちらを試してみたが、同じエラーの発生。

②rbenvの使用しているバージョンを変更し、再度`gem install bundler`

“`
$ rbenv versions
system
* 2.6.5 (set by /Users/○○○○○/.rbenv/version)
2.7.0

$ rbenv gl

rails6 + docker + postgreSQL + Materializeで開発環境を作ってみた。

##railsの環境構築

Docker3
Rails6.0.3
Ruby2.7.0
DB:PostgeSQL
こちらの環境で作成していきます。

##1.dockerを立ち上げる
@shungo_m様の[「DockerでRails6の環境構築を行う方法」](URL “https://qiita.com/shungo_m/items/fd1ab99fbe76d39e456c”)を参考にしました。

docker立ち上げに必要なファイルの作成

“`
$ mkdir myapp
$ cd myapp
$ touch Dockerfile
$ touch docker-compose.yml
$ touch entrypoint.sh
$ touch Gemfile
$ touch Gemfile.lock

“`

“`php:Dokerfile
FROM ruby:2.7.0
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

RUN apt-get update && apt-get i

ActiveHashで複数のプルダウンメニューを作る方法

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

2.ActiveHashとは何か

3.どのように使用するのか

4.補足

1.結論
—————————————-
モデルを複数作って、db/migrateに全て記載する!

2.ActiveHashとは何か
—————————————-
ActiveHashとは変更されないデータをモデルファイルに書き込むことでDBに逐一保存せずにデータを扱えるgemです!

3.どのように使用するのか
—————————————
ActiveHashの導入方法は他のgemと一緒なので省きます!
また自分が反映させたいテーブルも用意しておきます。

“`ruby:コンソール
%rails g model abcdefghi –skip-migrat

【Rails】フォームのエラーメッセージを非同期で表示する

`form_with`を`local: true`なしで使っても、通常エラーメッセージ部分は非同期処理になりません。
非同期で表示してみたので方法をまとめます。

## FormのView
`form_with`に`local: true`を付けないと、非同期で通信が行われます。

“`erb:app/views/tests/new.html.erb
<%= form_with model: @test do |f| %>
<%= f.text_field :name %>
<%= render 'shared/err_msg' %>
<%= f.submit %>
<% end %>
“`
“`erb:app/views/shared/err_msg.html.erb

“`

## Controller
`@test.save`が失敗した

【Nuxt × Rails】CORSエラーによるプロキシ設定

フロント側から、Railsにユーザー情報をフォーム送信すると、こんなエラーが。

“`console
Access to XMLHttpRequest at ‘http://localhost:3000’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
“`

通常、フロントもバックもドメインは同じURLだが、異なる場合もある。
そんな時発生するのが、`クロスドメイン通信を許可しない`というエラー。

そこで、プロキシ設定をNuxt側にもRails側にもすることで、CORSエラーを解消する必要がある。

[CORSについて](https://dev.classmethod.jp/articles/cors-c

gem FriendlyIdの紹介と注意点

##gem FriendlyIdについて
[FriendlyId Guide](https://norman.github.io/friendly_id/file.Guide.html)があるので一部抜粋したものを翻訳します。

> FriendlyIdはRubyのActive Recordのアドオンで、URLのidを文字列に置き換えることができます。

> **FriendlyIdを使用しない場合**
> http://example.com/states/4323454
> **with FriendlyId**
> http://example.com/states/washington
> 人間が読めるキーワードを使ってページを識別するURLの部分を作成します。
> これにより、ユーザーにとっても検索エンジンにとっても、アプリケーションをよりフレンドリーなものにすることができます。

gemの名前のFriendlyIdの由来はここから付けられたものだと言うことがわかりますね。

## 実装の例

弊社のサービスCarelyでも実際にfriendly_idを使用しているので紹介し

eachメソッドを使ったRubyの繰り返し処理(1から10までの和を求める)

# 環境
>![スクリーンショット 2020-08-31 15.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694973/7de31e7d-4555-29a3-20ac-21aa281f02fc.png)

# 模範回答

“`ruby
sum = 0

10.times do |i|
sum = sum + i + 1
end
“`

#自分の回答

“`ruby
sum = 0
numbers = [1,2,3,4,5,6,7,8,9,10]
numbers.each do |n|
sum += n
end
“`

#解説
>僕は配列に対してeachメソッドで繰り返し計算を行っているのに対して模範回答ではtimesメソッドを使っています。ブロックの外でsumという値を定義し、そのsumに対して行う処理をdoからendのブロック内で記述するという点は共通しています。しかし1から10まで全部書くのはスマートじゃないですね。「1から10まで」のように連続した値の範囲を表すも

フリーターでも分かる、jQuery基礎

どうもこんにちは、

今日はjQueryについて、

僕が学んだ基礎知識を共有していきたいと思います。

まずはじめに

簡単な公式を知らないと、

始まらないので公式から覚えましょう。

“`
$(’HTML要素’).メソッド(引数);

“`

です。

短っ!

と思った方もいると思いますが、

こっから色々と付け足していくのです。

もちろんコレで終わりなわけはありません。

簡単解説

HTML要素

というのは例えば、、

index.html
“`

こんにちは

“`

のところで言うh1です

あと、最後の  ;(セミコロン)   は忘れずにつけましょう。

コレが基本の構文ですね。

ではこの公式を使って、jQueryで何ができるのかを話していきます。

アニメーションを付けられる

はじめ見た時コレはすごいと思いました!

ほんの二行jQueryの記述を加えるだけでこんな変化を生み出せ