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

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

テーブルのデータが全て表示されてしまう問題の解決

現在ウェブエンジニアに転職するための個人アプリを作っています。
個人アプリ開発中に生じたエラーを解決できずに困っています。

##起きている問題
投稿だけを表示したいのに、テーブルに入れた情報が全部ブラウザ上に出てきてしまっているので消したい。
![スクリーンショット 2020-05-25 22.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/a0451ddd-316e-01a7-d7b3-097fbf1ceb5a.png)

“`ruby
= @posts.each do |post|
“`
この部分をコメントアウトしたら消えたので、ここの記述と関係しているようです。

# 解決方法
“`ruby
# before(表示される)
= @posts.each do |post|
# after(表示されない)
– @posts.each do |post|
“`
Rubyでは`=`だと表示されて、`-`だと表示されない設定でした。
答えは単純でした。。。

元記事を表示

Searchkickでのデバッグ術

Railsコンソールで`dubug: true`属性?を付与して検索を実行してやると、そのときに使われた Search Option, Setting, Mapping, Results(検索スコアとか)を見れていい。

[Searchkick Dubug](https://github.com/ankane/searchkick#debugging-queries)

“`.rb
> Post.search “日本の絶景”, fields: [:name, :description, :category_name], operator: “or”, debug: true
“`

“`
Model Searchkick Options
{:language=>”japanese”,
:_type=>
#

元記事を表示

[Rails]初学者によるRubocopの導入

# はじめに
Rubocopとは、Rubyの静的コード解析ツール。
[ruby-style-guide
](https://github.com/rubocop-hq/ruby-style-guide)に従って、ソースコードの修正・改善点を指摘してくれます。

また、インデントのずれや、不必要なスペース・改行などは特定のコマンドを打つことで自動で修正してくれるので、自分にとってはもちろん、他の人が見ても読みやすいコードに整形することが出来ます。
※あくまで初学者の観点で設定等を決めています。

# 導入

“`ruby:gemfile
gem ‘rubocop’, require: false
“`
“`:ターミナル
bundle install
“`

# 使ってみる

“`:ターミナル
bundle exec rubocop
“`
実行すると、以下のような出力が得られます。
スクリーンショット 2020-07-10 8.06.47.pngRailsでcredentials.yml.encをAtomエディタで編集したかった色々(Windows)

初めてQiita書きます書き方全然わかりません許してください。
タイトルの通り、Rails5.2以降で追加されたらしいcredentials.ymlを
Windows環境でAtomエディタにて編集したかった時の色々です。(筆者はRails6ですが)
自分にいい感じの日本語記事が見つからなかったので、もういっそ自分で忘備録作ってしまおうと。
あと同じ目的だったり、ハマった人のためになればいいなと。

## 大先輩達による記事を読んでからのお話
以下2記事、リンクになっています。
[Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)

[たった30分でわかるcredentials.yml.enc[rails5.2] – 環境変数を定義する使い方 -](https://qiita.com/mylevel/items/92c4a2a2f96edb10e298)

## さっそくエラー

元記事を表示

【Rails6】CarrierWaveとfog-googleでGoogle Cloud Storage(GCS)に画像をアップロードした

Rails6で開発していますが、画像のアップロード機能どうしようかな〜と思って、active storageを最初に利用していましたが、RailsをAPIにしてNuxt.jsに返却するのが地味に面倒とか、気をつけないとN+1問題をめっちゃ発生させたりしそうで嫌だったので、CarrierWaveを利用することにしました。(別に頑張っても良かったんですが、その辺を考えるのが面倒だったので、もう少し実装が軽くなる方法を選びました。)

また、改めてCarrierWaveを利用しようと思ったきっかけも以下でした。

しかし、CarrierWaveに移行したのはいいんですが、S3の利用率が高いのかは分かりませんが、GCSの情報があまりなかったんですよね…。

ただ、画像をRails6(consoleですが)で、GCSに画像をアップロードすることが出来たため、備忘録を残したいと思います。

## Gemfile

“`rb
gem “carrierwave”
gem “fog-google”
gem “g

元記事を表示

(1分で決める)empty?とblank?とpresent?の使い分けについて

(備忘録)説明最小限にしてすぐ使用できるようにまとめた。(結論)blank?かprresent?をどっちか覚えとけば何とかなる。

## empty?を使う時は
**下記の条件を満たしたうえで中身が空であるか知りたいときに使用。**
①必ず入れ物が存在していること
②中身が数字やtrue,falseでないこと

“`ruby
if box.empty?
“`
①②を満たさない場合は NoMethodErrorが生じる。

## blank?を使うときは
**中身が空orそもそも存在しているかを知りたいときに使用**

“`ruby
irb(main):001:0> box = nil
=> nil
irb(main):002:0> box.blank?
=> true
“`

## present?を使用するときは
**存在していてかつ中身が空ではないことを知りたいときに使用(!blank?と同義)**

“`ruby
irb(main):006:0> box = nil
=> nil
irb(main):007:0> box.present?
=> false

元記事を表示

Rails6 + Bootstrap4.5でドロップダウンが機能しない

以下解決プロセス

application.html.erbのタグ内に
以下を挿入

“`
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
“`

/app/assets/javascript/application.jsがないよと言われるようになるので

/app/assets/javascript/application.js
を作成し以下を記述
(Rails 6ではデフォルトでこの場所にapplication.jsがない)

“`
//= require jquery3
//= require popper
//= require bootstrap
“`

これだけだとapplication.jsがassets pipelineに含まれてないとエラーがでるので

/app/assets/config/manifest.js

“`
//= link_tree ../images
//= link_directory ../

元記事を表示

TECH CAMP学習 個人アプリ作成②

# deviseを使用して、ユーザーモデルを作成

個人アプリ作成でdeviseのインストールを行いました。
まずはGemfileに下記を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613470/95bbc057-aea7-1238-d075-df862621ea68.png)

ちなみにdeviseは日本語で**「工夫する、考案する、案出する、発明する」**という意味だそうです。

次にターミナルにて
『bundle install』
『rails g devise:install』
『rails g devise user』

を順番に実行します。

そしてマイグレーションファイルを以下2点のように編集します。
※注意 #は省いていただいて結構です。
**① null:falseは空の状態での保存を防ぐ為に使用します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/

元記事を表示

デバッグを表示する

何度も忘れるのでメモ。

デバッグを使う事でより開発がスムーズになる。
現在表示されているページのcontroller,view,actionなどが確認できる。
注意点として本番環境ではデバッグ情報は表示するべきではありません。

そのため、次のように記述することで開発環境のみデバッグ情報を表示されるよう対策しています。

まずはgem ‘byebug’をbundle installする。
その際development、test環境で使用するのでgroup :development, :test do~end内に書き込む。

“`
group :development, :test do
gem ‘sqlite3’
gem ‘byebug’, platforms: [:mri, :mingw, :x64_mingw]
end
“`

“`
$ bundle install
“`

下記コードをapp/views/layouts/application.html.erbに書き込む。

“`
<%= debug(params) if Rails.env.developm

元記事を表示

railsのbelongs_toに指定できるoptional: true

“`ruby:

class Task < ApplicationRecord has_many :user end class User < ApplicationRecord belongs_to :task, optional: true end ``` このoptional: trueとは何なのか? これはbelongs_toの外部キーのnilを許可するというもの! 上記のコードであれば、User.task_idが外部キーとなり、値がセットされていない場合はバリデーションで弾かれるが、optional: trueを設定しておくと、外部キーがnilであってもDBに保存できる!

元記事を表示

find_or_create_by

#find_or_create_by

引数の条件に指定するデータがあった場合はそのデータを返します。無かった場合は新規作成します。

“`ruby

def find_or_create_by(attributes, &block)
find_by(attributes) || create(attributes, &block)
end
“`

##メリット
結果が冪等になる。
冪等とは何度行っても得られる結果が等しいこと。

すでに指定するデータが存在した場合は新規作成をしないので、
find_or_create_byを繰り返したとしても、得られる結果が等しいです。

対してcreateメソッドだった場合は、
繰り返した分だけ新規作成が行われるので冪等ではないと言えます。

元記事を表示

RailsとAjaxを使ったいいね機能の非同期通信

転職活動用に個人アプリを開発中です。
今回、RailsとAjaxを使って、いいね機能の非同期化を行いました。

AjaxではjQueryを使うため、jQueryを使えるようにしておく事前準備が必要です。それは[参考記事](https://qiita.com/__tambo__/items/45211df065e0c037d032)を見てください。以下の記述はそれが設定済みのうえでの話です。

![PFCMASTERいいね機能Ajax.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/5d1432fd-7fc2-5870-92db-031410b5f21e.png)

### 実現した機能
・「いいね」ボタンを押すとリロードせずに「いいねを取り消す」に表示が変わる
・「いいね」ボタンを押すとリロードせずにlikesテーブルにデータが1つ追加される
・「いいね」ボタンを押すとリロードせずにいいね数が1つ増える
※その逆もしかり

# このコードでうまくいきました

### コントロー

元記事を表示

Enumの設定ミス。なぜかEnum指定の列からデータが取れない…

### 発生した背景
※備忘録として記録します(ネタ的にはしょぼいです…)
以下のようなモデルにEnum設定したとき、データが取り出せない。

“`ruby:table.rb
class ColorManage < ApplicationRecord enum color_type: { single: 0, double: 1, graphic: 2 } (省略) ```` (前提)singleというラジオボタンを押すと、0が入力されるようにする。 ```erb:color-edit.html.erb
<%= color_manage_record.radio_button :color_type, :single ,class:"color-form__button" %>
<%= color_manage_record.label :color_type, "single-color", {class: "color-form__tag"} %

元記事を表示

Timeオブジェクトの次の値ってどうやってだすのが正しい?

## 概要

RubyでTimeオブジェクトを扱ってると境界問題にぶち当たる。
普通にやってるとRangeオブジェクトなりを使ってそこまで問題になることはないが、普通じゃないやり方をしていて躓いた。

## 環境

Ruby: 2.6.2
Rails: 5.1.2

## そもそもハマった問題

“`ruby
Time.now.end_of_day
=> 2020-05-15 23:59:59 +0900
“`

これの次の値を取りたい。
※ end_of_dayはわかりやすいから使ってるだけであって、とある日の先端、終端が欲しいわけではない。飽くまでもTimeオブジェクトの次の値

真っ先に思いついたのがこれ

“`ruby
Time.now.end_of_day + 1
=> 2020-05-16 00:00:00 +0900
“`

ただ、これは間違い

“`ruby
(Time.now.end_of_day + 1).iso8601(3)
=> “2020-05-16T00:00:00.999+09:00”
“`

`+ 1` は飽くまでも1秒加算であって、次の値に

元記事を表示

Rails5でECサイトを作る⑥ ~seedデータ投入~

# はじめに
架空のベーカリーで買い物できるECサイトを作るシリーズ、[Rails5でECサイトを作る⑤](https://qiita.com/GreenFingers_tk/items/cd8535744f79e22234db)の続きです。
この後の実装を続けていく上で、初期データを入れておいた方が何かと都合が良さそうなので、一旦そちらを優先することにしました。

# 複数のseedファイルを管理する
あくまで表示が正しくできるか確認するためのデータなので、最小限作っておけば良いと思います。しかし、Model数が多い分、やはり一つでファイルで全て済まそうとすると記述量が膨大になってしまいます。
そこで、新たにseedsというフォルダを作り、その中に各Model毎の初期データを入れることにしました。(一つのseeds.rbファイルで済ませたい人は[こちら](#データをまとめて作成))

“`
$ cd work/fumizuki/db
$ mkdir seeds
$ cd seeds
$ touch customer.rb
$ touch address.rb
$ touch gen

元記事を表示

circleciでrspecを実行すると、Webpacker can’t find applicationのエラーが出た

## ローカルでは通っていたテストがcircleciで実行すると、Webpacker can’t find applicationのエラーが出て、解決できたのでメモとして記録

## 参考URL
https://qiita.com/Shantti-Y/items/8ddc1aee3b854ee7877c

## rspecのエラー全文
“`ruby:
Failure/Error: <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>

ActionView::Template::Error:
Webpacker can’t find application in /home/circleci/FANTRA/public/packs-test/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true fo

元記事を表示

Ruby 二次元配列

## 二次元配列とは?

2次元配列とは、プログラムで利用される配列において、**配列の中に配列が入っている配列**のことである。

## ソースコード
“`ruby
fruits_price = [[“apple”, [200, 250, 220]], [“orange”, [100, 120, 80]], [“melon”, [1200, 1500]]] # 配列Key 合計額算出

fruits_price.each do |fruit|
sum = 0
fruit[1].each do |price|
sum += price
end
puts “#{fruit[0]}の合計金額は#{sum}円です”
end
“`
## 結果
“`
appleの合計金額は670円です
orangeの合計金額は300円です
melonの合計金額は2700円です
“`

### 説明
### keyにフルーツの名前、valueにそのフルーツの値段が配列で複数

“`
[[“apple”, [200, 250, 220]]
“`

### Ruby each文

元記事を表示

CKEditorで余計な

# ハマったこと
記事のコンテンツをCKEditorを使って管理しているのですが、以下のタグを保存したときに悲劇は起こりました…

“`

  • ほげほげ
  • ふがふが
  • なむなむ
  • “`

    CKEditor君 :「`

      `タグなかったから追加しといたわ~ 感謝してや」

      わい :「いや、テンプレート側に`

        `書いてあるんだけど余計なことしないで(# ゚Д゚)」

        CKEditorの仕様で保存すると `

          ` タグが消えてしまうらしい。

          # 原因
          [ドキュメント](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dtd.html#property-S-intermediate)を見てみると `CKEDITOR.dtd.$intermediate` なるものがありました。

          >List of elements that are not to exist standalone that must live under it’s parent element.

    元記事を表示

    (初心者向け)【Rails】時短テク!slimの導入方法と使い方

    # はじめに
    Rubyのテンプレートエンジン`slim`の導入方法と使い方をご説明します:relaxed:
    Railsでは、`html.erb`というファイルでhtmlを書きますが、`

    `や`<% %>`を毎回記入するのが少し面倒です。
    `slim`を利用すると、htmlをより簡潔に書けるため、開発にかかる手間を減らすことができます。

    ※ **erbとは**
    embedded Rubyのこと。Viewファイルの中の好きな場所でRubyのコードを実行できるようになります。

    # 1. slim 導入方法
    * railsのディレクトリにある`gemfile`に、2つのgemを追加します。

    “`ruby
    gem ‘slim-rails’
    # railsでslimを利用するためのgem

    gem ‘html2slim’
    # html.erbをhtmle.slimに変換するためのgem
    “`
    * ターミナルで`bundle install`と打ち、gemの追加を反映させます。

    “`
    bundle install
    “`

    * 以下のコマンドをターミナルに打ち、app/

    元記事を表示

    [Rails]カテゴリを選択するフォームを作りたい

    こんにちは。
    現在Railsで掲示板をつくっています。

    掲示板のスレッドをカテゴリで分類して表示したかったので、スレッドをたてる時にカテゴリーを選択するようにしようと思って実装しました。

    最近Railsを触り始めたので詳しい人いたらマサカリおねがいします。

    ## バージョンとか
    Ruby 2.5
    Rails 5.1

    ## DB・準備
    カテゴリにたくさんのスレッドが紐づいている設計です
    スクリーンショット 2020-07-09 12.08.06.png

    モデル間の設定も忘れずに…

    “`ruby:thread.rb
    class Thread < ApplicationRecord belongs_to :category end ``` ```ruby:category.rb class Cate

    元記事を表示

    OTHERカテゴリの最新記事