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

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

Railsチュートリアル 第13章 ユーザーのマイクロポスト – 画像のリサイズ

# 画像の自動リサイズ処理が必要な理由

ファイルサイズに対するバリデーションは、[Railsチュートリアル 第13章 ユーザーのマイクロポスト – 画像の検証](https://qiita.com/rapidliner00/items/351b9b08e91c61237de2)で実装できました。しかしながら、画像サイズ(縦横の長さ)に対する制限は、現状では存在しません。そのため、大きすぎる画像サイズ(横2048ピクセル等)のファイルがアップロードされると、以下のようにレイアウトが壊れてしまいます。

スクリーンショット 2020-01-10 8.15.32.png

# ImageMagickのセットアップ

Railsチュートリアルを進めていっている開発環境においては、ImageMagickは必ずしもインスト

元記事を表示

Railsチュートリアル 第13章 ユーザーのマイクロポスト – 画像の検証

# アップローダーにおけるバリデーションの実装

## 画像フォーマットのバリデーション

### 現状では、画像として無効なファイルをアップロードできてしまう

[Railsチュートリアル 第13章 ユーザーのマイクロポスト – 基本的な画像アップロード](https://qiita.com/rapidliner00/items/a6733ce24f77b3eef3df)で実装した画像のアップローダーでは、画像として無効なファイルをアップロードすることができてしまいます。

“`
Started POST “/microposts” for 172.17.0.1 at 2020-01-08 09:50:59 +0000
Cannot render console from 172.17.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by MicropostsController#create as HTML
Parameters: {…略, “micropost”=>

元記事を表示

#Rails migration / Remove unique index / Mysql2::Error: Cannot drop index ‘index_xxx_on_yyy_id’: needed in a foreign key constraint

I dont know its best way or wrong way
but it seems to work

# model Annotation = DB table schema info

Wanna delete UNIQUE index

“`diff
# == Schema Information
#
# Table name: books
# user_id :bigint not null
#
# Indexes
#
– # index_books_on_user_id (user_id)
+ # index_books_on_user_id (user_id) UNIQUE
#
#
# Foreign Keys
# fk_rails_… (user_id => sims.id)
#
“`

# Model

“`rb
class Book < ApplicationRecord belongs_to :user end ``` # Fail Migration `

元記事を表示

[JavaScript,Rails]Uncaught TypeError: Cannot read property ‘length’ of undefined のエラー解決例

#1.エラーの状況とそのエラーに関係したファイル(Railsの中のJavaScriptのエラー)

<エラー文>
スクリーンショット 2020-01-19 5.15.53.png

<エラーに関連したファイル>

“`js:app/asset/javascripts/users.js

$(function() {
function addUser(user) {
let html = `

${user.name}

RailsのTime.zone.parseでハマった

`Time.zone.parse`に渡す引数は日付っぽいものであり、かつvalidであればきちんとparseされ、
日付として認識されるフォーマットでありつつも値がおかしい(`2020-99-99 99:99:99`など)場合は`ArgumentError`がraiseされ、
そもそも日付として認識されない文字列は`nil`を返す。
`nil`を返すんですね。(2回目)

最後の場合も`ArgumentError`がraiseされる想定だったためハマった。

要件としては「ユーザーが自由入力できる入力欄において、日付としてvalidな文字列であればそのまま保存し、invalidな文字列であればエラーを吐かせる」ものだったのであまりないパターンかとは思う。

## 参考
### リファレンス
https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-parse
`20:00:00`とかもいけるっぽい(日付は現在日付になる)

### Qiita
https://qiita.com/slightair/

元記事を表示

独学ではじめてAWS(EC2)にデプロイする方法⑩(macでNginxのインストールと設定)

# Nginx
Webサーバの一種であるNginxの導入と設定を行います。
nginxは静的コンテンツ(つまりサーバ上のファイル)を高速に配信するように設計されている。
ユーザーのリクエストに対して静的コンテンツの取り出し処理を行い、そして動的コンテンツの生成をアプリケーションサーバに依頼することが可能

## Nginxをインストール
下記のコマンドでインストール

“`
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nginx
“`

## Nginxの設定ファイルを編集

“`
[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf
“`

下記を貼り付ける
(ディレクトリの場所などは、自分にあった場所を指定してください)

“`ruby:rails.conf
upstream app_server {
# Unicornと連携させるための設定。
# アプリケーション名を自身のアプリ名に書き換えることに注意。今回であればおそ

元記事を表示

AWS(EC2)でNginxのrails.confを設定する方法

AWSのNginxを設定する際に、rails.confファイルの設定をします。

この方法の説明が意外とないので、説明していきます

## Nginxの設定ファイルを編集

“`
[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf
“`

rails.confファイルが開かれたら、下記の記述をします。

“`ruby:rails.conf
upstream app_server {
# Unicornと連携させるための設定。
# アプリケーション名を自身のアプリ名に書き換えることに注意。
server unix:/var/〇〇〇(アプリをまとめているディレクトリ)/〇〇〇〇〇〇<アプリケーション名>/tmp/sockets/unicorn.sock;
}

# {}で囲った部分をブロックと呼ぶ。サーバの設定ができる
server {
# このプログラムが接続を受け付けるポート番号
listen 80;
# 接続を受け付けるリクエストURL ここに書いていないURLではアクセ

元記事を表示

Railsで簡単可逆暗号(ActiveSupport::MessageEncryptor)

# Railsで簡単に可逆暗号をする方法

情報が古くなったため、rails4.2, rails5.0, rails5.1, rails5.2, rails6.0 で変更点確認し更新

## 使い方

`ActiveSupport::MessageEncryptor` を利用することで簡単に可逆暗号ができる

“`rb
key_len = ActiveSupport::MessageEncryptor.key_len
secret = Rails.application.key_generator.generate_key(‘salt’, key_len)
crypt = ActiveSupport::MessageEncryptor.new(secret)
encrypted = crypt.encrypt_and_sign(‘Qiitaきーたキータ’)
# => “Adp1SPOkYRqLgTMoAlcyEganoimCdT8k/tj4zQXZiUiN–9A34IcmwD9pG4ysj–+drve0A05vHPXYF33aw4hg==”
crypt.decrypt_and_v

元記事を表示

ActiveRecord::AdapterNotSpecified: ‘production’ database is not configured. が表示された場合

アセットコンパイル時に下記を実行するが

“`:ターミナル(EC2)
[ec2-user@ip-172-31-23-189 <アプリ名>]$ rails assets:precompile RAILS_ENV=production
“`

この際にエラーが表示される場合がある。

#### エラーが出る場合

“`
ActiveRecord::AdapterNotSpecified: ‘production’ database is not configured. Available: [“default”, “development”, “test”, “database”, “username”, “password”, “socket”]
“`

下記を修正してください
database.yamlに『 <<: *default 』を追記する (もともとあるが、いらないだろうと思い消してしまうとエラーが表示される) ```ruby:config/database.yml production: <<: *default # ここが抜けているはず database

元記事を表示

データベースのリセット方法

## データベースをリセットする。

“`ターミナル.
$ rails db:migrate:reset

もしくは
$ rails db:reset
“`

元記事を表示

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’が表示された場合(本番環境)

AWSのEC2にデプロイしようとした際に、下記エラーが表示された場合の対処方法をまとめたいと思います。
『Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’』

### 原因
問題点としては、下記のsocketに接続できないのが問題

“`ruby:credentials.yml
db:
database: アプリ名
username: root
password: 設定したPW
socket: /var/lib/mysql/mysql.sock #ここに接続ができない
“`

mysqlを再起動すると、/var/lib/mysql/mysql.sockが自動的に作成されるので、起動

## Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

1) MySQLの起動確認
Mysql2::Error: Can’t connect to local MySQL server through

元記事を表示

【rails5.2】master.keyを本番環境(AWS EC2)に設定(追加作成)する方法

## master.keyを作成していないとどうなるのか?
master.keyを本番環境で設定しておかなければ、rails db:create RAILS_ENV=productionなどを実行した際にエラーが表示される。

rails db:create RAILS_ENV=productionを実行

“`
$ rails db:create RAILS_ENV=production
“`
するとエラーが表示される

“`
rails aborted!
NoMethodError: Cannot load database configuration:
undefined method `[]’ for nil:NilClass
“`

この'[]’はdatabase.ymlの下記が読み込めないために発生する。

“`ruby:database.yml
production:
<<: *default database: <%= Rails.application.credentials.db[:database] %>
username: <%= Ra

元記事を表示

The asset “” is not present in the asset pipeline

assetへのパイプラインがうまくいってない時に起こるエラーです。

config/envitonments/production.rbで

“`
config.assets.compile = true
“`
をして、再起動してとりあえずうまく行かない時は、

“`
<%= image_tag user.image.to_s %>
“`
みたいな記述をしていませんか。
特にbxsliderをお使いの初学者の方。
このままだとただの変数を入れているだけになるので
そういう場合は、

“`
<%= image_tag '/assets/user.jpg' %>
“`
みたいに「app/assets/images」ディレクトリに置いて呼び出すか。
refireのgemを使って呼び出せばうまく行きます。

“`
<%= f.attachment_field :image %>
“`

元記事を表示

content_tagでmodalやリンクを表示する

# はじめに
RailsでWebサービスを構築していると、フロントのコードをサーバーサイドで実装する場面ってありますよね。(あんまりないか)
Railsにはcontent_tagというメソッドが用意されていて、フロントのコードをサーバーサイドで記述することができます。

# content_tag
content_tagの引数は以下のように構成されています。

– 第一引数: タグ
– 第二引数: 内容
– 第三引数: クラスなどのオプション

“`
# divタグ生成
content_tag(:div, ‘hoge’, class: ‘fuga’)
# =>

hoge

“`

# modalを表示するには
modal表示のサンプルです。

“`hoge_helper.rb
def show_modal_button
content_tag(:a, class: ‘btn btn-default form-control’, data: { toggle: ‘modal’, target: ‘#hoge-modal’ }) do

元記事を表示

Ruby on Rails使用時のデバッグで便利なメソッド

今日、久しぶりに使いたくなってなかなか思い出せなかったので念のためにQiitaにも書いておく。

そこそこの規模で開発していると、自分が今みているメソッドがどこから呼ばれているか分からない時たまにありませんか?
メタプログラミング的に書かれていたりしてgrepがなかなか上手くできないケースがあります。

そういう時に便利なのがrubyの`caller`メソッド
https://magazine.rubyist.net/articles/0031/0031-BackTrace.html

一旦pryで止めて、callerメソッドを実行するとその前に実行されていたメソッドの歴史が表示されるので、今見ているメソッドがどこから呼ばれているかすぐにわかります。

いやー、思い出せてスッキリ。

元記事を表示

FontAwesomeをhamlに導入する際に詰まったお話

TwitterやFacebook等のリンク用のアイコンとしてよく使われるFontAwesomeだが、今回はこれをRailsアプリケーションに導入する方法を記述していく。

## FontAwesomeのサイト

https://fontawesome.com/
こちらのサイトから利用する。Proと付いているものは有料だが、それ以外であれば無料で使える。

## 前提
RailsにFontAwesomeを導入する方法として2通りある。
gem ‘font-awesome-rails’を利用するか、gem ‘font-awesome-sass’を利用するか
の2種類。

FontAwesomeが導入できるという点では変わらないが、違いとしては、
**’font-awesome-rails’ではfa_icon, fa_stacked_iconの二種類のヘルパーメソッドが使用できる**が、**最新版のfont-awesome5に対応していない**
**’font-awesome-sass’では上記二種類のヘルパーメソッドが使えない**が、**最新版のfont-awesome5が利用できる**

元記事を表示

Railsチュートリアル第1章で勉強をブロックしたやつ

#はじめに
この記事では私が[Railsチュートリアル](https://railstutorial.jp/chapters/beginning?version=5.1#sec-up_and_running)の第1章でつまづいた所を共有します。
個人的な備忘録ですが、プログラミング学習入門で人気のRailsなのでお役に立てればうれしいです!

#実行環境
[AWS Cloud9](https://console.aws.amazon.com/cloud9/home/product?#)を使用しました。チュートリアルの手順通りに環境設定しました。
#問題
[Railsチュートリアル1.3.2](https://railstutorial.jp/chapters/beginning?version=5.1#sec-up_and_running)で、

“`Console
rails server
“`

を実行し、アプリケーションをブラウザで開こうとしたところ、
まったく開きませんでした…

#解決策
色々調べた結果、ブラウザに導入していた広告ブロックが邪魔をしていました。広告ブロ

元記事を表示

(自分用)Rails設計時(実装時)の注意点のまとめ

Railsに限らないトピックも含まれそう

* モデルとビューのどちらに実装しようか迷うときは、Decoratorパターンを検討する
* モデルの共通化
* Mix-inを使う場合は、 `ActiveSupport::Concern` を利用する
* STI(単一テーブル継承)
* 継承を利用して、似たようなActiveRecordモデルクラスの共通化を図る
* 継承関係にある一連のモデルクラスはすべて1つのテーブルに対応付けられる
* 各クラスのインスタンスに対応するレコードは、すべて同一のテーブルに格納される
* 対応するテーブルには `type` というカラムを用意する必要がある
* 各レコードが所属するクラス名が格納される
* https://guides.rubyonrails.org/association_basics.html#single-table-inheritance
* コントローラの共通化にMix-inを使う場合は、

元記事を表示

【Rails】【Ajax】Ajax(非同期通信)でコメント編集

前回のコメント投稿と削除はremote trueをリンクボタンに設定して実装しました。
[【Rails】Ajax(非同期通信)でコメント投稿、削除](https://qiita.com/hiro266/items/56ec2c350fd9d8ca22d8)
今回はコメントの編集をajax関数を使用して実装していきます。

注))前回からの続きです

# 環境
`Rails 5.2.3`
`mysql 5.7.28`
`gem jquery-rails`
→application.jsでrequireしておく。

# 完成デモ

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

# 実装
機能を四つに分けて実装していきます。
1. 編集ボタンクリックでラベル非表示、コメントエリアとボタン表示
2. キャンセルボタンクリックでラベル表示、コメントエリアとボタン非表示
3. 更新

元記事を表示

【Rails】キャッシュされた古いページが一瞬表示されるのを避ける方法

#困っていたこと
取得したパラメータによって表示したいページを変更したくて
以下のようなコントローラ設定の時、

“`ruby:articles_controller.rb
class ArticlesController < ApplicationController def show if session[:for_article_show] == 1 render '/articles/pattern_A' elsif session[:for_article_show] == 2 render '/articles/pattern_B' end end end ``` `session[:for_article_show]`が1の時に pattern_A.html.erbが表示され、その後 `session[:for_article_show]`が2に変更されてshowアクションが実行されると、 pattern_B.html.erb が**直接**表示されると思っていました。 実際は、**一瞬だけ pattern_A.

元記事を表示

OTHERカテゴリの最新記事