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

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

before_actionの使い方

プログラミングスクールの最終課題フリマアプリの開発において
コードレビューの際に指摘をもらった箇所を復習用に記録しておきます。

マイページ実装の際にrailsでcredit_card_controller.rbに
コードを記載しました。
重複しているコードを別で定義して書き変え、before_actionにて呼び出すようにとのこと。

“`
@card = CreditCard.find_by(user_id: current_user.id)
“`
このコードを下記のように定義し、before_actionで呼び出しました。

“`
def find_card
@card = CreditCard.find_by(user_id: current_user.id)
end
“`

今回はcreate意外でbefore_actionが実行されれば良いので
下記のようにnew,show,destroyと指定しております。

“`
class CreditCardsController < ApplicationController require "pay

元記事を表示

【Rails6 / Google Map API】住所を投稿してマップに複数マーカーを立てる

# はじめに

## つくるもの
こんな感じの投稿した住所または地名から緯度と経度を検索してそれぞれの地点にマーカーを立てるマップです。
(「東京都墨田区押上1丁目1−2」(スカイツリー)のように住所を投稿することも可能です)
![スクリーンショット 2020-08-28 1.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/d1774490-5d6d-1282-e7bd-30aa88610b0c.png)

## 用意しておくもの
#### 前提知識
今回はGoogleMapAPIを用いたマップの表示はできているものとして進めていきます。
GoogleMapAPIを用いたマップの表示がわからない人は下記の記事をお読みください。
[【Rails6 / Google Map API】初学者向け!Ruby on Railsで簡単にGoogle Map APIの導入する](https://qiita.com/nagaseToya/items/e49977efb6
86ed05eadb

元記事を表示

Railsのtime_selectでデフォルトで入力される日付を、画面上にある別のフィールドの入力値にする

### 背景とやったこと
Railsのアプリで、こんな感じのフォームを作っていました。
実施日を`date_field`で選択し、開始時間・終了時間をそれぞれ`time_select`で選択します。

なお、実行環境は`rails 5.2.4.2`です。
[![Image from Gyazo](https://i.gyazo.com/8732f9653b30168bf4ddf8251658e334.png)](https://gyazo.com/8732f9653b30168bf4ddf8251658e334)

viewファイルの中身はこんな感じです。データ型は、全てのフィールドで`DateTime`型でした。

“`haml:view
.form-group
= f.label :date, “実施日”
= f.date_field :date
.form-group
= f.label :begin_at, “開始時間”
= f.time_select :begin_at
.form-group
= f.label :closed_at, “終

元記事を表示

【Mysql】CSVファイルをDBにインポートする

##今日やること
CSVでダウンロードしたファイルをmysqlを使ってDB(phpmyadmin)へ格納する

以前結構悩んだ上に無事成功させたのですがメモるのを忘れ再度時間を要してしまったため備忘録という意味も込めてまとめる。

##前提
スプレッドシートに入力したトレーニング情報をcsvでダウンロードしmysqlを用いてDBへ格納させる。

##スプレッドシートをCSV形式でダウンロードする
該当のSSのシートを表示し「ファイル→ダウンロード→カンマ区切りの値(.csv、現在のシート)」の順に押下しダウンロードする。
![スクリーンショット 2020-09-04 21.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/9abba886-bf5b-1cce-f9a3-b5d4c276b965.png)

とっても簡単。

##現在使っているオブジェクトの傘下に置いてあげる
![valuX-AWS-Cloud9.png](https://qiita-image-store.s3.a

元記事を表示

本番環境で画像アップロード時のエラー:「Permission denied @ rb_sysopen – /var/www/rails/app/tmp/uploads/cache/xxxxxx」への対処法

Rrailでアプリを作りAWSの本番環境でデプロイが完了し、動作確認で画像を投稿しようとしたら以下のエラーが出ました。

“`Permission denied @ rb_sysopen – /var/www/rails/app/tmp/uploads/cache/xxxxxx“`

権限周りでエラーが起こっているらしいです。
調べたところ[こちらの記事](https://qiita.com/4EAE_Learner/items/1e0824a71cb4eb41780a)が参考になりました。

私の場合EC2にSSHログインし、対象フォルダまで移動、権限の変更で解決できました。
(usernameは適宜変更して下さい。 “whoami” というコマンドで確認できます)

“`
$ ssh app_name_key_rsa
$ cd /var/www/rails/app/tmp/uploads/cache
$ ls -la
drwxr-xr-x 2 root root 6 8月 14 00:44 .
drwxr-xr-x 4 root root 32 8月 14 00

元記事を表示

【Rails】モデルスペックの基礎【RSpec】

# モデルスペックにおいての正常系/異常系

## そもそも正常系,異常系とは

### 正常系

簡単に言うと、**想定されたインプット(初期化等)があった時に、想定されたアウトプットや状態を得ることができること。**

### 異常系

**想定されていないインプットがあった時に、エラーを出力されるなどの想定されたアウトプットが得ることができるということ**

### 【例】ユーザー登録の場合

下記のデータを要求しているモデルがあったとする。

– name
– email address

上記の二つを満たしていれば、登録できる→**正常系**
上記の二つのうち一つでも欠けていると登録できない→異常系

# モデルスペックでの正常系/異常系を考える

– 正常な属性を持つモデルであれば有効
– バリデーション(異常)に引っかかる属性であれば無効

こんな感じで区別できますよね。

# よくわからないけど、書いてみようぜ。

## 前提

userモデルは下記の項目を必要とする。

– name
– password
– email

`email address`は**重複不

元記事を表示

has_manyとbelongs_toの存在チェック ー optional: trueとは?

# 動機
`belongs_to`側での、関連先の存在チェックは多くの場合で必要だと思いますが、`has_many`側での関連先の存在チェックはあまり出会すことがなかったので、調べてみました。

# やりたいこと
userモデルとteamモデルの関連付け。ただし、以下の制約付き。

– userが少なくとも1つはteamを持っていなければならない。(1つ以上のチームに所属する必要がある)
– 逆に、userに関連付いていないteamは存在してはいけない。

↓こんな感じの関連付けです。
![スクリーンショット 2020-09-04 19.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684915/5568f415-1057-ef3f-dc83-581c5d04b530.png)

# 環境
Rails 6.0.3
Ruby 2.7.1
mysql2 0.5.3

# postモデルの関連付け
“`ruby
class Team < ApplicationRecord belongs

元記事を表示

Choices.jsでリッチな複数選択リストを実装する

スマートな操作性と、モダンなUIを提供してくれる「[Choices](https://joshuajohnson.co.uk/Choices/)」をRailsアプリに組み込む方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/7a549c5f-0ec8-54c8-7bdc-885ccaa7d3b0.png)

今回のサンプルでは「タスクに複数のメンバーをアサインする」部分を例に解説してみたいと思います。

# 動作イメージ

![choices.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/e4a300f2-111e-a7b2-b533-0a01b243c97b.gif)

# 環境とgem

– ruby 2.7.1
– rails 6.0.3
– webpackerは有効
– turbolinksは無効
– hamlit-rails
– simple_form

# 手順

元記事を表示

Rails fields_for体系

## How to use
####Overview
formの中で異なるモデルに値を入力したい時に有効的よん。
####Example
Hotelモデルがあります。さらに、Hotelモデルと多対多の関係にあるFeeモデルがあります。これらは、ホテルとホテル予約料金プラン(複数)の関係性ですねー。

ホテル登録フォームがあります。その中には、ホテル予約料金プランを入力するフォームがありますっ。しかし!ここで問題が発生。通常のform_forを使ったフォームではモデルが1つしか設定できません?

そこで!fields_for登場。form_forに親モデルであるHotelモデルを指定。そして、form_forの中にfields_forを作りFeeモデルを指定。あとは、通常と同様にオプションを指定すれば、フォームにデータを入力できる!

(途中)

元記事を表示

rails server が停止できないときの対処法

## はじめに
Railsチュートリアルを進めているときに rails server が起動できないことがありました。
結論として、rails serverを終了していたつもりが終了できておらず、起動しっぱなしだったため新たに起動することができないということでした。
備忘録としてrails server終了できていないケースと、終了させる方法をまとめました。

### 動作環境
* Windows10 (64bit)
* WSL(Ubuntu 18.04.4 LTS)
* ruby 2.7.1
* Rails 6.0.3.2

## rails server が停止できなくなったとき
* **Ctrl + C をせずにターミナルウィンドウを閉じたとき**
ターミナルを閉じてもrails serverはバックグラウンドで動いている。
そのため、下記手順でserver を停止する必要がある。
1. ps コマンドにオプション aux をつけて rails server のプロセス番号を調べる。
最後のCOMMAND 項目が Rails アプリ名のプロセスが該当プロセス。

元記事を表示

エラーバンドリングの出し方

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

2.エラーバンドリングの出し方

3.詰まったところ

1.結論
—————————————-
validates.errors.any.errors.full_messages.eachを使う!

2.エラーバンドリングの出し方
—————————————-
まずmodelにバリデーションを設定します!

“`ruby:app/models/buy_item
with_options presence: true do
validates :name
validates :date
end
“`
with_optionsはdo~endまでのpresence: true(空欄はダメ)というのを一辺に設定できるものです。
こちらの場合はnameカラムとda

元記事を表示

Rails スクレイピング手法 Mechanize について

こちらのはてなブログに投稿しています。

元記事を表示

Docker・Rails・pumaのローカル環境でSSL化

Docker・Rails・pumaの本番環境でSSL通信でCRUDの一部が上手くできないので、ローカルで色々試すめにローカル環境をSSL化しました。
その時の手順をまとめました。

# 前提

– 既にhttp接続でページが表示できている状態
– 証明書作成にopensslを使用
– Chromeはセキュリティで、接続できないのでfirefoxでアクセスし表示・動作の検証を行う
– ページアクセス時、通信は安全ではないというメッセージが返ってくるが、「詳細情報」→「危険性を承知で続行」で表示できる

# 実装手順

“`bash
# 証明書設置ディレクトリに移動
$ cd docker/nginx/ssl

$ openssl genrsa -out server.key 2048

# 登録情報は適当にしてます。。。
$ openssl req -new -key server.key -out server.csr
Country Name (2 letter code) []:JP
State or Province Name (full name) []:Fukuoka p

元記事を表示

【Docker】RailsとNuxt.jsアプリの仮想環境を作るには

NuxtとRailsを使ったアプリで、Docker環境を使うにはどうすれば良いんじゃ〜〜〜ということで、
参考までに、構築するまでのファイルやコマンドを順を追って説明していきます!

今回は、`feeder`というアプリの開発環境を構築していきたいと思います。

#自前で用意するファイルやディレクトリ

“`
# 自前で用意するファイル

|-web/
| |–appフォルダ
| |–Dockerfile
|–back/
| |–appフォルダ
| |–Dockerfile
| |–Gemfile
| |–Gemfile.lock # 空ファイル
|–docker-compose.yml
|–.git
“`

#コンテナ作成や起動(サーバー起動)、イメージ作成などまで手がける設定とDockerコマンドファイル

“`docker-compose.yml
version: “3”

services:
db:
container_name: database
image: mysql:5.7
env

元記事を表示

違うコントローラーのページにredirectするときのパス指定

サイトにコメント機能の実装をする際、
comments controllerに

“`ruby:qiita.rb
class CommentsController < ApplicationController def create Comment.create(comment_params) redirect_to item_path(item.id) end private def comment_params params.require(:comment).permit(:text).merge(user_id: current_user.id, item_id: params[:item_id]) end end ``` と記述したところ、データベース上に値は保存されてるけど、redirectがエラーとなり、「undefined local variable or method `item' for #< CommentsController:0x00007f7ef315cdd0 >」
と表示された。

[解決策]
redi

元記事を表示

Rails6で複数チェックボックスを使う!

オリジナルアプリのユーザー登録機能実装中複数チェックボックスを使いました!
初心者のため備忘録として初投稿します!
間違えていたらコメントで指摘をお願いします笑

チェックボックスの書き方

チェックボックスといっても書き方は色々あります。
今回は関連するモデルがあるのでcheck_boxメソッドを使いました。

“`
<%= f.check_box :food, {multiple: true}, food, nil %>
“`
こんな感じです。
languageの部分はそれぞれ指定したいオブジェクト名を入れてください。
ちなみにカラムの型はtext型で指定しています。
複数選択を可能にする為に、{multiple: true}を書きます。

キーのパラメーターを許可する

今回のアプリ製作ではユーザー登録にdeviseを使用しているので、application_controller.rbにのprivateメソッド内にチェックボックスのパラメーターを許可する為の記述をします。

“`
def configure_permitted_pa

元記事を表示

ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked

###はじめに
rails tutorialを学習中です。
学習中、テスト実行時に何度も遭遇したエラー

“`
RuntimeError: RuntimeError: database is locked
“`

“`
ActiveRecord::StatementInvalid: ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked
“`
これらがようやく回避できるようになりましたので記しておこうかと思います。

因みに余談ですが、9章まではこのエラーが出ても何度か繰り返し

“`
rails test
“`
とすると5回目くらいでパスすることが出来ていました。(非常に面倒でした)
しかし9章にて何度実行してもパス出来なくなりました。

###試したこと
①rails consoleにて

“`
ActiveRecord::Base.connection.execute(“BEGIN TRANSACTION; END;”)
“`
を実行

元記事を表示

ログインユーザーが、URLを入力しても特定のページに遷移できないようにする

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

2.どういう時に起きるか

3.どのように使うのか

4.ここから学んだこと

1.結論
—————————————-
”redirect_to” と ”unless”を使う!

2.どういう時に起きるか
—————————————-

“`ruby:buy_item_controller.rb
def edit
@buy_item = BuyItem.find(params[:id])
end
“`
例えば、
マイページやマイアカウント、自分の投稿したページを編集する時に”edit”アクションをプログラミングすると思います。

この時に上記のプログラムだけでは、URLに〜〜/〜〜/editと打ち込んでしまえば、ログアウトしているユーザーや、同じアプリケーションにログイン

元記事を表示

Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri –version 1.8.4

#環境
ruby 2.5.1
rails 5.2.4

#背景
rubyのバージョンを変え、dockerとmysqlを導入した際に、いつの間にかera

#問題

rails sを実行すると以下のログが出力される

“`
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri –version 1.8.4
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri –version 1.8.4
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pristine nokogiri –version 1.8.4
Ignoring nokogiri-1.8.4 because its extensions are not built. Try: gem pr

元記事を表示

高校の家庭基礎の課題で友人とAndroidアプリを作った話

# はじめに
こんにちは。高校2年の樅山([@momeemt](https://www.twitter.com/momeemt))です。

通っている高校の家庭基礎で「**ホームプロジェクト**」という課題を出されました。
私たちは「母親(や、父親)に負担がかからないような家事の分担が定着しないこと」を問題点と考え、家族で**たのしく家事を取り組む**ことのできる、**Androidアプリ 「Helpith」**を開発しました。

ホームプロジェクトとは、各自の生活の中から課題を見つけ、家庭科で学んだ知識や技術を生かして、課題解決を目指す学習活動のことです。
See(課題発見・テーマ設定)、Plan(実践計画)、Do(実践活動)、See(評価・反省)の過程を踏んで、家庭的な取り組みを行います。

また、高校生の家庭クラブ活動を推進している全国組織であるところの「全国高等学校家庭クラブ連盟(FHJ)」が昭和50年からホームプロジェクトコンクールを主催しており、優れた研究成果を残したプロジェクトは表彰されています。
興味があれば、[第40回 過去の審査結果](https://kateik

元記事を表示

OTHERカテゴリの最新記事