Rails関連のことを調べてみた2023年02月03日

Rails関連のことを調べてみた2023年02月03日

【Rails】render.comを使ってデプロイする

# 概要
– render.comを使用して、アプリケーションをデプロイする
– 無料プランを利用&クレジットカードの登録は行ない

# 開発環境
– OS:MacOS(m1チップ)
– 言語:ruby 3.1.2
– フレームワーク:Ruby on Rails7.0.2
– DB:PostgreSQL(←要注意:詳細後述)
– Docker等のコンテナは使わず、PCのローカル環境に構築

# 本番環境(production環境)を用意する
“`ruby:Gemfile
group :production do
gem “pg”
end
“`
ここで注意が必要
`gem “pg”`はPostgreSQLを使用するために導入(筆者はsqliteを使用していた)
render.comはデータベースをPostgreSQLしかサポートしていないため、
MySQLやSQLite等を使用している場合は、本番環境のデータベースのみPostgreSQLnに変更する必要がある

### gemをインストールする
“`
bundle install
“`
# render.yamlの作成
以下

元記事を表示

Cloud Run上にデプロイしたAPIサーバーが400 Bad RequestのYour client has issued a malformed or illegal requestを返す

ログにエラーが出力されず厄介な問題だったため共有します。

## 概要
GCPのCloud Run上にデプロイしたRuby on RailsのAPIサーバーにて、リクエストボディを含むGETリクエストのAPIを叩いたところ
`Your client has issued a malformed or illegal request`
と記載されたHTMLが返ってきました。以下HTMLを表示した画面です。
![スクリーンショット 2023-02-02 19.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153308/0b2dc917-9ccd-30b4-c6cc-cb92e6aed5e4.png)

## エラー詳細
ローカルでは問題なく動いており、Cloud Runにデプロイした本番環境のみで上記エラーが起こります。
Cloud Run上のログにはAPIが叩かれたことすら表示されていなく、リクエストボディを空にすると初めてログが表示されます。

## 原因
Cloud Runのようなクラウ

元記事を表示

【テックジム無料講座】Ruby on Rails講座 <問合せフォームを作ろう>の感想

テックジムが無料で開催している、Ruby on Rails講座 <問合せフォームを作ろう>をオンラインで受講してみました。Rubyを勉強した経験が無く、動画の通りには出来たものの、何をやっているのか良く解りませんでした。AWS Cloud9を利用しているので、ウェブベースで受講出来るのが便利だと思いました。現在の私の場合、テックジムさんのRuby on Rails本講座を受講する前に、progate等で、Rubyの基礎を学ばないと、独習は難しいと感じました。

1-0 環境構築編
1-1の解説動画
1-2の解説動画
1-3の解説動画
1-4の解説動画

元記事を表示

test

### 曖昧検索
“`ruby
assert_equal 1, page.all(‘a’, text: /Edit/i).count
“`

### クリック
“`ruby
find(“input[value$=’Create Category’]”).click
“`
“`ruby
# 最初の要素
find(“a”, text: /◯/i, match: :first).click
“`

### チェックボックス
“`ruby
Capybara.execute_script(
“window.scrollTo(
#{(target = find(‘label’, text: text = ‘公開設定’)).native.location.x},
#{target.native.location.y-300}
);”
)
check text
“`

### パスチェック
“`ruby
assert_equal category_menu_url(@public_category, @public_menu, locale: ‘ja’), cu

元記事を表示

rubyXLのconvenience_methods一覧

公式の方でまとめられているものを書き出しています
https://github.com/weshatheleopard/rubyXL/tree/master/lib/rubyXL

#### rubyXL/convenience_methods/cell
– change_contents
– remove_formula
– get_border
– get_border_color
– change_horizontal_alignment
– change_vertical_alignment
– change_text_wrap
– change_shrink_to_fit
– change_text_rotation
– change_text_indent
– change_border
– change_border_color
– is_italicized
– is_bolded
– is_underlined
– is_struckthrough
– font_name
– font_size
– font_color
– fill_color
– horizon

元記事を表示

【備忘録】NoMethodError: undefined method `change_contents’ for #

rubyXLを3.4.0以降のバージョンに上げたときに

“`
NoMethodError: undefined method `change_contents’ for # require ‘rubyXL/convenience_methods/cell’
require ‘rubyXL/convenience_methods/color’
require ‘rubyXL/convenience_methods/font’
require ‘rubyXL/convenience_methods/workbook’
require ‘rubyXL/convenience_methods/worksheet’

https://github-com.translate.goog/weshatheleopard/rubyXL/issues/328?_x_tr_sl=en&_x_t

元記事を表示

【Rails】同一カラムを複数作成し、同時にcreateする方法

# どうした?
[前回の記事](https://qiita.com/ysk91_engineer/items/c1830885866583160047)同様、ToDoアプリを作成しています。
Todoの投稿フォームを複数個作成し、同時に投稿する方法を学んだのでそのアウトプットです。

# 目標物の確認
今回実装する機能は下図です。
![ToDoApp_設計書 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/b7acf22e-da83-37fa-02e5-46d9c1674239.png)

`Todo.content`同士は異なるレコードです。
ボタンひとつで複数のレコードをいっぺんに作成します。

# 方法

**コントローラ**
“`ruby
def index
# 略

@category = Category.new
2.times { @category.todos.build }
end
“`

今回は**インデックスページで`new`していること**

元記事を表示

【Rails】Capistranoを利用した自動デプロイ実行時に発生したエラーの対処法

某スクールの最終課題をEC2で自動デプロイする時に発生した事象。
自動デプロイツール「Capistrano」を導入し、自動デプロイを実行した際に発生したエラーの詳細と解決方法について記載します。
導入目的:デプロイ時に必要なコマンド操作が1回で済み、手動デプロイする場合に起こりうる下記問題を解消することができる。
##### 手動デプロイで起こりがちな問題
・コマンドの打ち間違い、手順の間違いが発生する可能性がある
・手順が多く、煩わしい

## 発生したエラー
自動デプロイを実行する為に、ローカルターミナルで以下コマンドを実行したところ、
“`
% bundle exec cap production deploy
“`
以下エラーメッセージが出現。メッセージを見ると、「Bundler::GemNotFound: Could not find date-3.3.3 in any of the sources(gemfileの中に”date-3.3.3”が見つからないよ。)」とのこと。
“`
** DEPLOY FAILED
** Refer to log/capistrano

元記事を表示

【Rails6】親子関係のモデルに対して一度に値を入力する多分最もシンプルな方法【fields_for】

# どうした?
RailsでToDoアプリを開発しています。
ToDoリストを作成する時、
+ 親モデル: Category
+ 子モデル: Todo

を1つの動作で同時に作成する方法を調べたので、そのアウトプットです。

## 目標物の確認
今回作成するアプリはcategories/indexページにて新規投稿します。
新規投稿エリアには`category.title`と`todo.content`の記入欄を用意し、「投稿」ボタンを1つ押すだけで両方のモデルに対して`create`されるようにします。

![ToDoApp_設計書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/1b116ff9-7010-0218-8d46-ba1a2b3fe18b.png)

## 動作環境
“`ruby
$ ruby -v
=> ruby 3.0.2

$ rails -v
=> rails 6.1.7
“`

# 方法

## Model
本アプリでは親モデルに`Category`, 子モ

元記事を表示

Railsでupdated_atがばらばらなテストデータを作りたい

備忘録

結論

gem fakerを利用するぅ

“`
group :development, :test do
gem ‘faker’
end
“`

今回は既存データをアップデートしてます。

“`
models.each do |hoge|
fake_date = Faker::Date.between(from: 100.days.ago, to: Date.today)
hoge.update(Model.touch_attributes_with_time(*[], time: fake_date))
end
“`

元記事を表示

【Rails】EC2内でgemをインストールした際に発生したエラーの対処法

某スクールの最終課題をEC2でデプロイする時に発生した事象。(RenderからEC2への移行)
EC2にクローンしたアプリを起動する為に必要なgemをインストールする際に、
上手くインストールが出来ず解決にかなり時間を費やしてしまった為、
備忘録として以下にエラーの詳細と解決方法を記述しておきたいと思います。

## 発生したエラー
先ず、ローカル環境「bunder2.1.4」と同じバージョンのbundlerをEC2側でも導入する為に、下記コマンドを実行。
“`
[ec2-user@ip-***-**-**-*** <リポジトリ名>]$ gem install bundler -v 2.1.4
[ec2-user@ip-***-**-**-*** <リポジトリ名>]$ bundle install
“`
すると、下記エラーメッセージが出現。
メッセージの内容はターミナル上でpgのバージョン’1.4.5’を導入する必要があるとのこと。
“`
An error occurred while installing pg (1.4.5), and Bundler cannot conti

元記事を表示

Ruby include?メソッド

# include?メソッド
指定した値が配列や文字列内に含まれているかを判定するメソッドです。
指定した値が含まれている→true
指定した値が含まれていない→false  を返り値として返します。

例1
“`ruby
string = [“hello”, “goodbye”]
puts string.include?(“hello”)
“`

“`
true
# ターミナル出力
“`
例2
“`ruby
string = [“hello”, “goodbye”]
puts string.include?(“thanks”)
“`

“`
false
# ターミナル出力
“`

# include?メソッドとif文を使って文字列を検知するプログラムを作成する

条件1:名前を入力すると「登録が完了しました」という文字列を出力すること
条件2:名前の中にピリオド(.)がある場合は、「 “!エラー!記号は登録できません”」という文字列を出力すること
条件3:名前の中に空白(半角のみ)がある場合は、「 “!エラー!空白は登録できません”」という文字列を出力すること
※今回

元記事を表示

Railsのsanitizeを深追いしてみる

# はじめに

Railsには`sanitize`というHTML中のscriptタグなどを除去してくれるメソッドが存在しており、動的にHTMLを出力する際にXSS対策に有効な手段として広く使われています。

どのようなタグを除去してくれるか等、`sanitize`メソッドの実装が気になり調べてみたので備忘録として残しておきます。

# 調査

はじめにRailsコンソールで`sanitize`メソッドの定義元を調べます。

“`ruby:rails console
> helper.method(:sanitize).source_location
=> [“/Users/massaaaaan/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/actionview-6.1.7.1/lib/action_view/helpers/sanitize_helper.rb”, 81]
“`

これで`sanitize`メソッドは`ActionView::Helpers::SanitizeHelper`というモジュールで定義されていることがわかりま

元記事を表示

配列の操作一覧

### 配列について

初めて配列を操作するにあたり、どの様な操作が出来るか・動きをするかまとめていきます。

## 空の配列xを作成
“`
x = []
=>[]
“`
空の配列xを作成しました。
このxに要素(文字列や数字)を入れていきます。

## 空の配列xに0,0,1,2,2,3,4を入れる
“`
x.push(0,0,1,2,2,3,4)
=>[0,0,1,2,2,3,4]
“`

これで配列に要素を入れることが出来ました。
入れたばかりではありますが、さっそく削除していきます。

## 要素の削除

“`
x.delete(0)
=>[1,2,2,3,4]
“`
削除が出来ましたが、指定した”0″に該当する要素がすべて消えてしましました。

## 場所を指定して要素を削除

“`
x.delete_at(3)
=>[1,2,3,4]
“`
delete_at()で指定した、前から数えた数字の要素が削除されます。
ですので、今回は(3)を指定した為、前から3番目の”2″が削除されました。

## 指定範囲の要素を削除する

“`
x.slice!(1

元記事を表示

【rails】bootstrapの導入方法。自作cssの配置設定。おまけでjQueryの導入方法

githubのREADME.mdについて調べたので、qiitaでもできるのかなと思ったらできました。
mdはマークダウンというもので、#や*を使って文字を装飾できます。
# h1
* リストだったり。

まぁ、それは置いておいて。本題に入らせてもらいます。

# bootstrapの導入方法

– CDN
– ファイルの配置
– yarnをインストール

などで導入できます。

CDNとは コンテンツデリバリーネットワークの略
使ったことがないからよくわからないが、たぶんlinkタグとscriptタグを貼り付けて使うのだと予想する。ただ、ネットが繋がらないと使えないだろうし、バージョンが古くなっていくと使えなくなる可能性があるだろうから、オススメはしない。そこらへんも使う機会があれば調べるとしよう。

ファイルの配置で使う。ファイルをダウンロードしてzipファイルを解凍して、どこかに配置する。
どこかは知らない。app/javascript/webpack内だろうか? 機会があれば調べるとしよう。

yanrのインストール
yarnというパッケージマネージャでインストールする。

ya

元記事を表示

Ruby on Rails チュートリアル 非ログインユーザーからのプロフィールページへのアクセスを防ぐ

Ruby on Rails チュートリアル(第7版)を1周走破しましたが、個人的に気になる点があったので修正してみました。

気になる点とは、
”非ログインユーザーが、登録済みユーザーのプロフィールページにアクセスできる”点です。
(プロフィール編集ページにはアクセスできないため、問題ないのでしょうか?)

/users/(id) リクエストを送信すると、非ログインユーザーでもアクセス可能でした。

この操作を行っている箇所を探します。

“`ruby:users_controller.rb
def show
@user = User.find(params[:id])
redirect_to root_url and return unless @user.activated?
@microposts = @user.microposts.paginate(page: params[:page])
end
“`

showアクションでプロフィールページが表示されています。
この前にログイン確認をしたいので、

“`ruby:users_contr

元記事を表示

`bootsnap`を`1.16.0`にバージョンアップしたら`Psych::DisallowedClass`エラーが発生した

# 事象

`bootsnap`をバージョン`1.16.0`にバージョンアップしたら以下のエラーが発生しました。

“`ruby
Psych::DisallowedClass:
Tried to load unspecified class: Time
“`

# 原因

`ruby`の`YAML`パーサーライブラリ`Psych`において、バージョン`4.0.0`以降セキュリティ脆弱性対策として`YAML.load_file`メソッドの挙動がデフォルトで`safe_mode`という厳格なパースを行うように変更されている様です。
※ これまでの挙動と同じにするには`YAML.unsafe_load_file`を使う必要がある様です。

https://github.com/ruby/psych/pull/487

上記に付随して`bootsnap`でも `Date`と`Time`の値とエイリアスを適切に拒否する様に対応がされました。

https://github.com/Shopify/bootsnap/issues/434

“`ruby
Psych::DisallowedC

元記事を表示

Rails migrateエラー解決備忘録

# 概要
この度railsを触っているのですが、migrateのあたりが苦手で、よくエラーが
起きてしまって困っていたので、自分で忘れないようにメモをさせていただきます。

# 環境
Rails 6.1.7
ruby 3.1.2
AWS
cloud9

# 起きたエラー集
#### SQLite3::SQLException: table “tags” already exists
これが起きた背景は、タグ機能をgemなしで作っていたところに、gemを導入したことがきっかけです。
結局その後、gemを使わずにタグ機能の運用をしようとして、rails db:migrateしたことでエラーが起こりました。
考えなしに入れたり消したりしたらダメですね。

今回のSQLite3::…のエラーを解決していきます。

###### 手順
まず、tagsのテーブルが被っているので、テーブルを削除します。

“`ターミナル(cloud9).
ec2-user:~/environment/アプリ名 (main) $ rails db
↑SQLite3にアクセス
“`

“`ターミナル(clo

元記事を表示

Nginx+Next.js+Rails+PostgreSQLを使用した開発環境構築

# 概要

※当記事は所属している[株式会社コンピュータテクノブレイン](https://computer-tb.co.jp/2022/06/22/nginxnext-jsrailspostgresql%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%9f%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89/)にて投稿した内容を転載したものです。

再度環境構築の話となりますが、タイトルにある通り`Nginx`のリバースプロキシを使用し`Next.js`、`Ruby on Rails`の`Docker`を使用した開発環境の構築についての手順を紹介します。

データベースは`PostgreSQL`を使用しようと思います。

# 構成

2022年6月22日時点での環境を示します。

– macOS Monterey 12.4
– Docker 20.10.14
– Docker Compose v2.5.1
– Nginx 1.21.6
– Node.js v18.4.0
– Next.js 12

元記事を表示

Ruby 配列を使ったプログラムの作成

# each_with_index
each_with_indexはRubyに標準で組み込まれているメソッドです。
繰り返し処理をしながら、その要素が何番目に処理されたのか、表示することができます。

“`ruby
配列名.each_with_index do |item, i|

end
“`


“`ruby
animals = [“ねこ”, “とり”, “うさぎ”]

animals.each_with_index do |animal, i|
puts “#{i + 1}番目の動物は、#{animal}です”
end
“`

“`
1番目の動物は、ねこです
2番目の動物は、とりです
3番目の動物は、うさぎです
# ターミナル出力
“`

配列は0番目から始まるため、#{i + 1}としています。

# searchメソッドとeach_with_indexメソッドを組み合わせてプログラムを作る

“`ruby
def search(target_num, input)

input.each_with_index do |num, i|
if n

元記事を表示

OTHERカテゴリの最新記事