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/
# 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の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ではアクセ
Ruby
Rails
nginx
AWS
Rails5
# 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
アセットコンパイル時に下記を実行するが
“`:ターミナル(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
Ruby
Rails
AWS
EC2
Rails5
## データベースをリセットする。
“`ターミナル.
$ rails db:migrate:reset
もしくは
$ rails db:reset
“`
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
Ruby
Rails
AWS
EC2
Rails5
## 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
Ruby
Rails
AWS
EC2
RubyOnRais
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 %>
“`
# はじめに
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
今日、久しぶりに使いたくなってなかなか思い出せなかったので念のためにQiitaにも書いておく。
そこそこの規模で開発していると、自分が今みているメソッドがどこから呼ばれているか分からない時たまにありませんか?
メタプログラミング的に書かれていたりしてgrepがなかなか上手くできないケースがあります。
そういう時に便利なのがrubyの`caller`メソッド
https://magazine.rubyist.net/articles/0031/0031-BackTrace.html
一旦pryで止めて、callerメソッドを実行するとその前に実行されていたメソッドの歴史が表示されるので、今見ているメソッドがどこから呼ばれているかすぐにわかります。
いやー、思い出せてスッキリ。
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チュートリアル](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に限らないトピックも含まれそう
* モデルとビューのどちらに実装しようか迷うときは、Decoratorパターンを検討する
* モデルの共通化
* Mix-inを使う場合は、 `ActiveSupport::Concern` を利用する
* STI(単一テーブル継承)
* 継承を利用して、似たようなActiveRecordモデルクラスの共通化を図る
* 継承関係にある一連のモデルクラスはすべて1つのテーブルに対応付けられる
* 各クラスのインスタンスに対応するレコードは、すべて同一のテーブルに格納される
* 対応するテーブルには `type` というカラムを用意する必要がある
* 各レコードが所属するクラス名が格納される
* https://guides.rubyonrails.org/association_basics.html#single-table-inheritance
* コントローラの共通化にMix-inを使う場合は、
前回のコメント投稿と削除は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
jQuery
Ajax
コメント
非同期通信
#困っていたこと
取得したパラメータによって表示したいページを変更したくて
以下のようなコントローラ設定の時、
“`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.