Rails関連のことを調べてみた2022年12月21日

Rails関連のことを調べてみた2022年12月21日
目次

グループごとに投稿できる機能

こんにちは。寒すぎて凍えているGeeksalonの限界メンターです。

「アーティストごとにアルバムを投稿したい」、「飲み会ごとに飲んだ量でランキングを実装したい」、「旅行プランごとに行き先を登録したい」etc…

そんな声に応えた機能を実装してみました。ユーザーのグループ機能はあったんですが、投稿をグループ化するのはぱっと見つからなかったので、初めてですが記事を書いてみました。未熟者ではありますが、温かい目で読んでみてください♪

## 【目次】
1. 開発環境
2. 概要
3. アソシエーション
4. 機能実装
 ➢ モデルの作成
 ➢ コントローラーの作成
 ➢ アソシエーション
 ➢ HTMLの実装
  ・ おまけ:ランキング


## 【 1. 開発環境 】
・ruby 3.0.4
・rails 6.1.6

**- 前提 -**
・Userの機能は実装済み
・TweetのCRUD機能は実装済み


## 【 2. 概要 】
– コントローラー・モデルは以下3つ
– User:ユーザー
– Tweet:投稿(好きなものに置き

元記事を表示

脆弱性から学ぶRailsの仕組み(CVE-2022-23633編)

# 脆弱性から学ぶRailsの仕組み(CVE-2022-23633編)
少し前にやった[脆弱性からRubyの仕組みを学ぶやつ](https://qiita.com/0kate/items/e0209cd83b4992d75b19)を`Rails`でもやってみる記事。
前回同様「脆弱性の原理を把握する」という側面から、実際に脆弱性を試しつつ「その本体の仕組み」も学んでしまおうという趣旨。
`Rails`も業務で使うようになったので、これもちゃんと学んでみようと思う。

# 対象の読者
この記事の対象となる人はこんな感じで想定。
– `Rails`を使い始めたばかりで仕組みから学びたい人
– `Rails`はよく使ってるけど仕組みはよくわからないから知りたいという人

自分のような`Rails`入門したてホヤホヤの方にも勉強になれば嬉しいので、自分の理解度整理も含めて「`Action Pack`って何?」みたいな説明を軽くする箇所もあるためその辺はご了承ください。

# Ruby on Rails
さっきから「Rails、れいるず」と言っているもの。
言わずとしれたRubyのWebアプリケ

元記事を表示

Hotwireを理解するために選曲アプリを作ってみた

# はじめに
[Ateam Finergy Inc.× Ateam CommerceTech Inc.× Ateam Wellness Inc. Advent Calendar 2022](https://qiita.com/advent-calendar/2022/finergy-commerce-tech-wellness)の21日目の記事です。
本日はエイチームコマーステックの@hibiheionが担当します。

**Hotwire**はJavaScriptを使わずにSPA(Single Page Application)を作成することができる仕組みです。Rails 7では標準機能になっています。業務でRailsを使っている身としては無視できない技術だったので作ろうと考えていた個人開発のWebアプリに導入してみました。

# 選曲アプリの概要
カタログ情報を見ながら選曲するためのWebアプリです。ジャズをよく聴くのですが、その目線で見るとSpotify(に限らず私が知っている音楽ストリーミングサービス)が持っている情報が物足りないと感じていたことが作成理由です。本題から逸れるので

元記事を表示

Stimulus リファレンス: ターゲット

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/reference/targets

ターゲットを使用すると重要な要素を名前で参照できます。

“`html

“`

# 属性と名前

`data-search-target`属性はターゲット属性と呼ばれ、その値は`search`コントローラーで要素を参照するために使用できるターゲット名のスペース区切りのリストです。

“`html

元記事を表示

Litestreamを使ってSQLiteをS3にレプリケーションしてみた

## はじめに
昨今の円安でAWSコストを抑えるために[Litestream](https://litestream.io/)を試してみました。

## 環境
MacOS Monterey 12.5
Docker 20.10.21
Compose v2.13.0
Rails 7.0.4(Ruby 3.1)
SQLite 3.34.1
Litestream v0.3.8

## Rails(Docker)環境の下準備

“`Dockerfile
FROM ruby:3.1
ENV APP_ROOT /usr/src/app
ARG RUBYGEMS_VERSION=3.3.20

RUN apt-get update -qq \
&& apt-get install -y vim sqlite3 nodejs npm \
&& rm -rf /var/lib/apt/lists/* \
&& npm install –global yarn

# Download the static build of Litestream directly into the path

元記事を表示

DBにreferences型のカラムが追加できない

## 起きた問題
マイグレーションファイルに`refereces型`のカラムを追加したかったが、マイグレーションできなかった。

### 試したこと
全てロールバックした後、DBを削除し作り直し、マイグレーション。←ダメ
試しに`referenes型`のカラムだけマイグレーションファイルから消してマイグレーション。 ←できる

## 解決方法
参照先:[箱のプログラミング日記。](https://www.y-hakopro.com/entry/2019/06/29/103112)様
ありがとうございます:bow_tone3:

`rails g migration Addカラム名Toテーブル名 追加したいカラム名:カラム型`でマイグレーションファイルを生成。

中身を以下の内容に書き換え。

“`ruby
class AdduserToPrototypes < ActiveRecord::Migration[6.0] def change change_table :Prototypes do |t| t.references :user, foreign

元記事を表示

【Rails】インスタンス一覧と新規インスタンスを同時に取得するときの挙動が少し意外だった

# はじめに
先日、一覧を取得するページで新規レコードも登録できるフォームを設置する必要に迫られましたのですが、その時Railsが自分としては意外な動きをする部分があったので紹介します。
# 完成形イメージ

– `User`と`Task`モデルは1対多の関係
– `Task`の一覧を表示しつつ、同じページに新規タスクの入力フォームを設置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/c58768c4-a081-21fb-4dfd-8cba4e7530c4.png)

# エラーが発生するコード

“`ruby:tasks_controller.rb
def index
current_user = User.find(params[:user_id])
@tasks = current_user.tasks
@task = @tasks.new
end
“`
`@tasks`の書き方を変えた下記でも同じです。

“`ruby:tasks_contro

元記事を表示

RubyonRailsチュートリアル:実践メモ【第三章】

Ruby on Rails チュートリアル(Webサービス開発が学べる学習サービス)に従って、MVCフレームワークアプリケーションを作成していく。

**使用ツール** :
AWS Cloud9
## ローカルサーバーの使用方法
ローカルサーバーについてのまとめ。

※サーバーウィンドウの出し方
1. 一番上のメニューバーから、**preview**を選択する
1. **Preview Running Application**を選択する

#### **サーバーを立ち上げる**
“`
$ rails server
“`
※サーバーを立ち上げる際は、サーバー用とコマンド用のターミナルを分けると良い。
[新しくターミナルを開く方法](https://qiita.com/suzuki_q/items/59fea2e882197f562ead)
#### **サーバーをシャットダウンする**
`ctrl + C`

#### **ローカルサーバーが立ち上がらない時の対処法**
ポートが使用中というメッセージが出た場合、コマンドで実行中のファイルを確

元記事を表示

railsヘルパー link_toメソッド

“`Ruby
link_to “Home”, ‘#’
“`

Link_toメソッドの第一引数にはリンクテキスト、第二引数にはURLを書く。

“`html
Home
“`

元記事を表示

rails テストのGreenとRedが見やすくなるコード

rails newを実行すると、以下のファイルが自動で生成されます。

“`Ruby:test/test_helper.rb
ENV[‘RAILS_ENV’] ||= ‘test’
require_relative ‘../config/environment’
require ‘rails/test_help’

class ActiveSupport::TestCase
parallelize(workers: :number_of_processors)
fixtures :all
end
“`

このファイルに以下のコードを追加します。

“`Ruby
,
,
require ‘rails/test_help’
#↓この部分です。
require “minitest/reporters”
Minitest::Reporters.use!
,
,
class ActiveSupport::TestCase
“`

するとテストを実行した時の表示が変わります。

“`Bash:Before
rails test
Running via Spring preloa

元記事を表示

herokuデプロイでcouldn’t find repositoryが出た時の対処法

エラー

“`Bash
remote: ! No such app as mysterious-dusk-30075.
fatal: repository ‘https://git.heroku.com/mysterious-dusk-30075.git/’ not found
“`

原因

herokuアプリを一度デプロイした後に、アプリを削除してしまったこと。

解決策

・もう一度herokuアプリを作って、リモートリポジトリの設定をしなおす。

“`Bash
git remote set-url heroku <リポジトリ名>
git remote set-url heroku https://git.heroku.com/safe-gorge-41567.git
“`
これでもう一度デプロイすれば、できた。

参考サイト

[【Heroku】デプロイ(fatal: repository ‘app_url’ not found)](https://qiita.com/TakaKun/

元記事を表示

railsのテストコードを少し読んでみた

“`Bash
rails g controller StaticPages index about
“`
上記のコマンドを実行すると、以下のテストファイルが生成されます。

“`Ruby:static_pages_controller_test.rb
require ‘test_helper’

class StaticPagesControllerTest < ActionDispatch::IntegrationTest test "should get index" do get static_pages_index_url #static_pages/indexをリクエスト assert_response :success #ステータスコードが200~299 end test "should get about" do get static_pages_about_url #static_pages/aboutをリクエスト assert_response :success end ``` デフォルトのテストとして、生成し

元記事を表示

Railsで複数DBに接続し、データベース単位でスキーマやmigrationを管理する

# はじめに

Railsで複数データベースを利用するにあたり、ハマりポイントがいくつかあったので忘備録として残しておきます。

# 対象読者
– Railsで複数データベースを管理したい
– 複数データベースを使用する場合のモデルの取り扱い方法を知りたい。クラス名がコンフリクトするのを回避したい
– データベース単位でスキーマファイルを管理したい
– データベース単位でmigrateやrollbackをしたい
– 既に別リポジトリで管理しているデータベースに接続できるようにしたい。(が、migration管理はしたくない)

Railsで複数データベースを扱う記事は[公式ドキュメント](https://railsguides.jp/active_record_multiple_databases.html)含め多数見つかりましたが、上記を全て解決する記事がなかったので今回まとめることにしました。

# 今回やること
1リポジトリで3つのデータベースに接続。
わかりやすくするため、データベース名はcat, dog, birdとします。

“`
cat: 別リポジトリで管理。migr

元記事を表示

rails provideメソッド

“`html:index.html
<% provide(:title, 12) %>



<%= yield(:title) %>/ 26




“`
provideメソッドでパラメータを引き渡す。
yieldメソッドでパラメータを受け取る。

元記事を表示

Rails Turboでvalidateが通らない無効なformの処理に書くunproccessable_entityについて

### 概要
PFを個人開発しているrailsしか知らない素人です。なので記事の信憑性については甚だ疑問があります。

万物は流転するものであり、色々と変わっていくもの…
railsはrails7から[hotwire](https://hotwired.dev/)(含むTurbo)がdefaultになりました。でかい変更ですよねこれ?
hotwireが何者なのかは色々な記事やサイトで説明されてますので割愛させていただきますが、簡単に言えばDHHの愛がこもったJSが書けない私へのギフトです。
アプリをフロントと分けてrailsはapiモードでjsonを出し入れするバックエンドのみに徹するみたいなことはきっと大変だと思うんですよ。(やったことないんで推測です)
railsのみでもモダンなアプリを作れるんだぞっていうやつです。

rails7に触ってまず何これ?となったのが、以下の様に無効なフォーム送信時のelse処理に書いてある`status: :unprocessable_entity`ってやつです。
“`ruby
def create
@quote = Quote.new

元記事を表示

【Rails】Mechanizeを利用して、サイトの情報を取得して表示する方法【スクレイピング】

# 1:概要

**railsでスクレイピングでhtml情報を取得し、欲しい要素を抽出して自サイトに表示させる方法**を紹介していきたいと思います。

スクレイピングとはWebやデータベースを広く探って「データを抽出する手法」のことです。
Mechanizeというgemを使った方法を紹介していきたいと思います。

今回は2種類ご紹介したいと思います
①Qiitaのトレンド記事の見出しを取得し、リンク付きで表示する方法
②[https://craftgawker.com/](https://craftgawker.com/)(手作り作品投稿サイト)から写真を取得し表示させる方法

### 完成図イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373315/177e8a5c-85b2-f15e-3fb7-d349c37123d7.png)


![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazo

元記事を表示

RailsアプリケーションをRuby3.0系にあげるために苦労したこと3選

現在Qiitaでは [graphql-rubyアップデートで引っかかった点(1.8->1.12) – Qiita](https://qiita.com/WakameSun/items/eab39302b9580b51b7a2) でも触れた通り、Ruby3.0へのアップデートを進めています。
基本的に自分1人がエイヤエイヤと進めて、ほぼほぼ動く(Rspecは全部通ったが、まだ実際に動かす検証が足りない状態)のものが完成しておりどんなに遅くなっても1月末には出せるだろうという状態です。
そこで、早計ではありますがここに苦労したよという部分を何個か選んで書いてみることにしました。
もしかしたら、今後何かにはまって増えるかもしれません。

## 1. 破壊的変更に付いていけず放置されたGem対応
若干主旨からは外れそうな気もしますが、一番苦労したのはこれです。
基本的にはDependabotなどにより可能な限り新しい状態を保とうとしていますが、 **破壊的変更多すぎ!今は余裕ないから後で!** 放置されてしまうGemや、そもそもDependabotが作るPR数を絞っているとなかなかPRが作られ

元記事を表示

ransack使用時の注意点

この記事は[Ruby on Rails Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ruby-on-rails)の20日目の記事です。

# はじめに

ransackは検索機能を楽に実装することができるgemです。
https://github.com/activerecord-hackery/ransack

スター数は執筆時現在5.3kで、今なお開発が続けられており、人気のgemと言って差し支えないでしょう。
しかし、そのセキュリティ上の問題点についてはあまり注目されていないように感じます。
実際、執筆時現在Googleで「ransack」と検索するとセキュリティについて触れられていない記事が散見されます。
この記事ではransackのセキュリティ上の問題点とその対策について紹介します。

# セキュリティ上の問題点

**デフォルトで任意のカラムに対して検索ができてしまいます。**[^1]
後述の手順によってカラムの中身を特定可能です。

## 具体例

usersテーブルにはカラムsecret_t

元記事を表示

Ruby on RailsでCloud Spannerエミュレータを使ってみる

[PONOS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ponos) の20日目の記事です。
昨日は@tequila0725さんの[BitbucketでPR作成時に表示されるコミットメッセージリストをPR説明テンプレート有りでも表示する](https://qiita.com/tequila0725/items/2074958ee693dc58bac6)でした。

# はじめに

Cloud Spannerは計画的ダウンタイムがなく、無制限のスケーリングなど、他のデータベースにはない特徴を持ったデータベースです。

https://cloud.google.com/spanner?hl=ja

標準のActiveRecordはSpannerには対応していませんが、Googleからactiverecord-spanner-adapterが提供されていますので、そのGemを使って「Ruby on Rails」 + 「Cloud Spanner」の開発することできます。
この記事では、Cloud Spannerエミ

元記事を表示

Stimulus リファレンス: アクション

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/reference/actions

アクションはコントローラーでDOMイベントを処理する方法です。

“`html

OTHERカテゴリの最新記事