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

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

【Rails】Mongoidでembeds_manyの子要素の数を取得する

## 概要
RailsでMongoDBを使用する際、埋め込み型のリレーション(embeds_many)の子要素の数を取得する方法を記載します。

## サンプル例題
親要素はブログ記事、子要素はコメントとして、ブログ記事にコメントの配列を持たせるようなイメージになります。

“`article.rb
class Article
include Mongoid::Document
field :_id, type: String
field :title, type: String
field :contents, type: String
embeds_many :comments
end
“`

“`comment.rb
class Comment
include Mongoid::Document
field :user_id, type: String
field :post_comment, type: String
embedded_in :article
end
“`

## 対応方法
対象のドキュメントについて、全子要素を取得し

元記事を表示

form_withでデフォルトのデータ送信先を変更する[Rails]

ポートフォリオアプリを作っています。
作品の一覧と各作品の詳細は誰でも見られるようにしようと思いますが、作品の投稿と編集は管理者だけができるようにしたいと思います。

管理者ユーザーの作成は、過去の自分のこちらの記事を読んで実装できたのですが、

[【初心者向け】管理者ユーザーと管理者用controllerの追加方法[Ruby, Rails]][1]
[1]:https://qiita.com/tanutanu/items/7ce8826615f1af605164

その後、管理者ユーザーの投稿機能をつけ、submitボタンを押したときに、以下のようなエラーが出ました。

[![Image from Gyazo](https://i.gyazo.com/e987d1db32f9084329e6e98e980551c6.png)](https://gyazo.com/e987d1db32f9084329e6e98e980551c6)

何、`/works`に**POST**メソッドでつながるルーティングがないそうです。
確かに、`rake routes`で確認してみると、管理者ユーザーが

元記事を表示

【Vuex】Rails(devise_token_auth)+Vue.jsのSPAでサインアウトするサンプルコード

## はじめに
Rails + Vue.jsのSPAで**devise_token_auth**を使ってサインアウトするサンプルコードを残します。

リクエストヘッダ情報の保存に**Vuex**を活用しました。

## 環境
“`yaml
OS: macOS Catalina 10.15.1
Ruby: 2.6.5
Rails: 6.0.2.1
Vue: 2.6.10
vuex: 3.1.2
axios: 0.19.0
“`

## 考え方

[devise_token_authの公式ドキュメント](https://github.com/lynndylanhurley/devise_token_auth/tree/master/docs/usage)の、**sign_out**のくだりにはこう書かれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/19f999f1-82a7-ab6d-fda7-038821e9c22a.png)

> Use this ro

元記事を表示

【Rails】Rspec何言ってるか解読してみた件。コントローラー#index編

今回は、写真とタイトルを投稿するアプリケーションの**tweetsコントローラーのindexアクション(トップページを表示する)が問題なく動くかどうか**、Rspecという言語を使ってテスト。

##テストする内容は2つ。
1. **tweets_controller.rb内でindexアクションの定義文で生成した@tweetsに、意図したものが入っているかな?**

“`ruby:tweets_controller.rb
def index
@tweets = Tweet.includes(:user).page(params[:page]).per(5).order(“created_at DESC”)
end
“`
1. **テスト環境上で、indexアクションを起こすリクエストを飛ばして、indexアクションに対応したビューが返ってくるかな?**

##コントローラーのテストの際は、2つの点に注意。
①tweets_controller.rbにおいて、テストしたいアクションに対し、before_actionが定義されていないこと。
②gem rails-co

元記事を表示

RailsでiOSアプリのURI スキームに対応する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110571/3a89bb3e-bb83-12f1-415d-c5178bac8563.png)

> 一瞬「あれっ…」ってなったので備忘録

# TL; DR
– `routes.rb`内でダイレクトルーティングで定義すればOK

# バージョン
– Ruby:2.6.1
– Rails:5.2.3

> タイトルにiOSと書いてますがAndroidも対応できます。ただのRoutingの話なので。

# やりたいこと
– RailsがWebとモバイルアプリの両方のサーバサイドの役割を担っている
– モバイルアプリ内で、特定の画面に遷移させるURIスキームを使いたい
– メニューなどで表示されていないページへの遷移など
– 上記の例としてInstagramに「運営からのコメント」があり、チャットで操作説明を受ける画面に遷移させたいような目的があったとする
– ヘルパーリンク:`qa_chat`
– URIスキーム:

元記事を表示

フォームクラスを使う

※この記事は、シリーズ記事「多人数によるRailsアプリケーション開発」の1つにする予定です。

ここでは、フォームクラスの使い方について考えます。フォームから送信されたデータを保存するときに、ActiveRecordのモデルではなく、ActiveModel::Modelをインクルードしたクラスを使い、バリデーションやコールバックをそちらに移してしまう、というものです。

私はフォームクラスと呼んでいますが、ネット上ではフォームオブジェクト(Form Object)と呼んでいる人が多いので、検索するときはそちらで。

サンプル: https://github.com/kazubon/blog-rails6-vuejs
環境: Rails 5.2以上

## メリット

– 機能1つ(画面1つやフォーム1つ)をクラス1つに対応させることで、ソースコードのどこに実装があるか分かりやすくなる。別のプログラマが改修する際に、あちこちのファイルを探し回らなくてよい。
– Fat Controllerを防ぐとともに、モデルクラスをすっきりしたもの

元記事を表示

Railsチュートリアル 第13章 ユーザーのマイクロポスト – マイクロポストを操作する

# マイクロポストリソースのルーティング

Micropostsコントローラーの内容を実装する前提条件として、まずは必要なルーティングを`config/routes.rb`に記述していかなければなりません。但し、「Micropostリソースのインターフェースへのアクセスは、プロフィールページ・Homeページを介して行われる」という前提があるため、Mircopostsコントローラーに`new`や`edit`のようなアクションは必要とされません。実際に必要とされるアクションは、`create`と`destroy`の2つのみとなります。

以上を踏まえて、`config/routes.rb`に対して実際に行う変更の内容は、以下のようになります。

“`diff:config/routes.rb
Rails.application.routes.draw do
get ‘password_resets/new’

get ‘password_resets/edit’

root ‘static_pages#home’
get ‘/help’,

元記事を表示

GKEで自作コンテナのRails6を起動する

# はじめに
Rails6プロジェクトの新規作成からGKE上で動作させるまでを試した結果となります。
今回試したのは以下3点です。
– Dockerイメージ(Ruby公式 2.7.0)から新たにRails6用Dockerイメージを作成する
– 作成したDockerイメージをDockerHubへ登録
– DockerHubに登録したイメージを使ってGKEのノードを作成し起動する
# 手順
## 1.Dockerイメージの取得
“`bash
$ docker pull ruby:2.7.0
“`
## 2.プロジェクトディレクトリ、Gemfileの作成
“`
$ mkdir project_name
$ cd project_name
$ docker run –rm -v “$PWD”:/usr/src/project_name -w /usr/src/project_name ruby:2.7.0 bundle init
“`
## 3.Gemfileの編集
以下のコメント箇所を外したくらいです

“`Gemfile:Gemfile
#gem ‘rails’
“`

##

元記事を表示

Fargate及びECSでコンテナからAWSのIAM認証を利用する

## 概要

AWSでコンテナを利用する場合、FargateやECSが候補に上がると思います。
コンテナからAWSの各種サービスを利用する場合、IAMのCredentialsを利用する必要があります。
いつも意識せずに利用しているIAMですが、裏ではどういう構成になっているのか確認していきます。

## 確認方法

Fargateでsshできるようにして、コンテナ内でCredentialsを探します。

Fargateでsshするには以下の記事を参考にしてください

– https://qiita.com/pocari/items/3f3d77c80893f9f1e132
– https://qiita.com/ryurock/items/fa18b25b1b38c9a0f113
– https://qiita.com/fnaoto/items/c980efa39c2b1597331e

## 結果

Fargateでは`AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`という環境変数にCredentialsへのファイルファイルパスが入っているようです。

元記事を表示

【第7章】Railsチュートリアル 5.1(第4版) ユーザー登録

大まかな流れの自己整理が目的のため、不足・誤り等あれば追記&訂正していきますのでご指摘頂けますと幸いです:bow_tone1:
なお、筆者は[YassLabさんの動画版](https://railstutorial.jp/#screencast)で学んでいるため、本記事は「チュートリアル sample_app」+「他補足」~~個人的に「電子ページ以上に分かりやすい!」と感じた解説部分+参考記事を整理してみようと試みた劣化~~の内容寄りになってます。

# 7.1 ユーザーを表示する

##params
Railsで送られてきた値を受け取るためのメソッド(その後Railsが保存を行う)。中身はハッシュ。
主に、以下の2つ
・投稿フォームなどPOSTで送信されたデータ
・検索フォームなどGETで送信されURLにクエリとして入るデータ

ex.params[:id] → ユーザなどのid

<参考>
[【Rails】paramsについて徹底解説!](https://www.pikawaka.com/rails/params)
[【Rails入門】params使い方まとめ](https

元記事を表示

Railsチュートリアル 第13章 ユーザーのマイクロポスト – ユーザーのフィード画面に対するテストは正しく動いているか

# 概要

「[Railsチュートリアル 第13章 ユーザーのマイクロポスト – マイクロポストを操作する – 演習「フィード画面のマイクロポストをテストする](https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-exercises_micropost_tests)」より、演習1番目の内容です。Railsチュートリアル本文には以下のようにあります。

> [リスト 13.55](https://railstutorial.jp/chapters/user_microposts?version=5.1#code-microposts_interface_test)で示した4つのコメント (「無効な送信」など) のそれぞれに対して、テストが正しく動いているか確認してみましょう。具体的には、対応するアプリケーション側のコードをコメントアウトし、テストが`red`になることを確認し、元に戻すと`green`になることを確認してみましょう。

なお、「それぞれの確認で変更したソースコードは、確認が終わったら変更前の状

元記事を表示

【Rails】Rspec何言ってるか解読してみた件。コントローラー#edit編

今回は、**写真とタイトルを投稿するアプリケーションのtweetsコントローラーのeditアクション(投稿したツイートの編集画面を呼ぶ)が問題なく動くかどうか、Rspecという言語を使って**テスト。

テストする内容は以下の2つ。

1. **tweets_controller.rb内でeditアクションを定義した際に生成したインスタンス変数に期待する値が入っているかな?**

“`ruby:tweets_controller.rb
def edit
@tweet = Tweet.find(params[:id])
end
“`

1. **擬似的にeditアクションを起こすリクエストを飛ばして、ちゃんとeditアクションに対応したビューが返ってくるかな?**

コントローラーのテストをする際は、2つの点に注意。
①tweets_controller.rbに、テストしたいアクションに対して、before_actionが定義されていないこと。
②gem rails-controller-testingをインストールしよう。

また、**factory_botを利用し

元記事を表示

link_toの使い方

#link_toとは
link_toはリンクを作成できるrailsのヘルパーメソッドの事。
ビューファイルに記述できるメソッドになる。
#link_toの種類と使い方

“`ruby:例
<%= link_to "テキスト", "リンク先のパス" %>
“`
“`ruby:例
<%= link_to "Yahoo!", "https://www.yahoo.co.jp/" %>
“`
### method指定
HTTPメソッドを指定する時に使い、何も指定しない時は「get」になる。
destroyアクションを動かしたい時のHTTPメソッドはdelete。
下記のコードを記述。

“`
<%= link_to "削除", "/users/1", method: :delete %>
“`
### 画像リンク作成
link_toと同じヘルパーメソッドであるimage_tagを使用。

“`
<%= link_to image_tag('test.jpg'), 'パス' %>
“`
### 内部リンク作成
内部リンクはPrefixを使用して作成する。

“`ruby:ト

元記事を表示

【Rails】1つのテーブルに複数の外部キーを設定

##複数のテーブルを参照
###モデル生成時に設定する場合
“`terminal
$ rails g model Song user:references mc:references song
“`
“`rb:migrationファイル
class CreateSongs < ActiveRecord::Migration[6.0] def change create_table :songs do |t| t.references :user, foreign_key: true t.references :mc, null: false, foreign_key: true t.string :song t.timestamps end end end ``` ###後から追加する場合 ``` add_foreign_key :参照元のテーブル名, :参照したいテーブル名, column: :参照元につける外部キー名 ``` ```rb:migrationファイル add_foreign_key :s

元記事を表示

rails: datetime_selectをカスタマイズする方法

### やりたいこと
デフォルトで“datetime_select“を使うとデザイン的にあまり美しく無いので下記のようにカスタマイズしてみた。
デフォルトだと下記のような殺風景なデザインでUX的に美しくない。

__before__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159346/1cf1d5e7-972e-1c67-3627-56797cb18050.png)

__after__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159346/40c1b34b-4a14-6175-754d-c148ced1c4fb.png)

### どのようにしたらできるのか?
結論から言うと、“datetime_separator“を弄ることでafter後のデザインに出来る。
初めは、文字しか書けないんだろうなと思ったら“html“も書き込むことができた。

“`ruby

元記事を表示

【jQuery】RailsでValidation Pluginを使った動的なバリデーションチェックの実装その1

# はじめに
本記事がQiitaでの初投稿となります。
プログラミングスクールで開発中のECサイトアプリでjQueryのプラグインを使って
動的なバリデーションチェック機能を実装しました。
実装手順とRailsで使用する場合の注意点をシェアします。

# 開発環境
Ruby 2.5.1
Rails 5.0.7.2
jQuery 3.4.1
jQuery Validation Plugin 1.19.1
Haml 5.1.2
Sass 3.7.4

# jQuery Validation Pluginとは
jQuery Validation Pluginはバリデーションチェックが実装できるjQueryのプラグインです。

公式サイト:https://jqueryvalidation.org/

# やりたいこと
+ 入力フォームにユーザー情報を入力する際にリアルタイムにバリデーションをチェック
+ バリデーションエラーがある場合はエラーをリアルタイムに表示
+ バリデーションがNGの場合は入力欄が赤色、OKの場合は緑色に変更

# なぜjQuery Validation Pluginを選

元記事を表示

【Rails】Rspec何言ってるか解読してみた件。コントローラー#new編

今回は、**写真とタイトルを投稿するアプリケーションのtweetsコントローラーのnewアクション(新規ツイート投稿画面を呼ぶ)が問題なく動くかどうか、Rspecという言語を使って**テスト。

spec/controllers/tweets_controller_spec.rbに、**擬似的にnewアクションを起こすリクエストを飛ばして、ちゃんとnewアクションに対応したビューが返ってくるかな?**というテストコードを記述。

コントローラーのテストをする際は、2つの点に注意。
①tweets_controller.rbに、テストしたいアクションに対して、before_actionが定義されていないこと。
②gem ‘rails-controller-testing’をインストールしよう。

では、見ていきましょう。

“`ruby:tweets_controller_spec.rb
require ‘rails_helper’

describe TweetsController, type: :controller do
describe ‘GET #new’ do

元記事を表示

[Rails]rails sを実行した際のPG::ConnectionBadの対処法

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです!

#rails sを実行すると画像のようなエラー画面になります
9b14f558d5741ade85174b2f5f175e78.png

この様な場合は、PostgreSQLサーバーが起動していない事が原因の様です。
[PG::ConnectionBad の対処法 – Qiita](https://qiita.com/ho_soft/items/c8a2cbf087016b7a712b/)

ただ、macの場合は、以下のコマンドは使えないので

“`apache
$ sudo service postgresql

元記事を表示

Google Cloud Vision APIを使って、食品パッケージ画像からテキストを非同期で読み取りフォームに記載してみる

# 概要
ポートフォリオでGoogle Cloud Vision APIを使ってみたので紹介したいと思います。
ちなみに食品パッケージのサンプルは世界一おいしいアマタケのサラダチキン(ピザ味)を使用してます

[![Image from Gyazo](https://i.gyazo.com/66aa4bbbf4cbd8d892cdb26c6c77ce3a.gif)](https://gyazo.com/66aa4bbbf4cbd8d892cdb26c6c77ce3a)

# 詳細
## 下準備
詳細は省きますが、Cloud Vision API を利用するため GCP のサービスアカウントの json ファイルをダウンロードします。gem ‘google-cloud-vision’も bundle installしてください。keyファイルのPathはcredentials.yml.encで管理しました。
(時間が空いたときに詳細手順を記載します…)
[参考:RailsにGoogle Cloud Vision APIを導入し、簡単に過激な画像を検知する
](https://qi

元記事を表示

【Rails】CSVを取り込み、計算し、画面に出力

運営しているシステムの大幅回収にあたり、DBを移行しました。

その際あるテーブルのIDが連番になっていなかった部分を1から連番にしたのですが、関連するテーブル(1対多)のIDを1つずつ手動で変更するには量が膨大すぎたので、IDの値を簡単に変更するためのプログラムを組んだので内容を記録します。

##プログラムの内容
・webページ上でCSVファイルをアップロード
・受け取ったファイルの各行1列目(一番左の項目)を配列に保存する
・数値を確認し、値ごとに計算を行う(42~117の間の数値だった場合-10、など)
・計算後の数値を画面に出力

画面に出力された数値をコピペすることで、手元のCSVのIDを一括で修正することが出来ます。

##実装
“`app/controllers/csv_controller.rb
class CsvController < ApplicationController require "csv" def input; end def output file = params[:file] @a = Array.new

元記事を表示

OTHERカテゴリの最新記事