Ruby 2.6、Rails 5.2 からの Ruby 3、Rails 7 へのバージョンアップ
Herokuで稼働させていたRailsアプリケーションが `Heroku-18` のEOLを間近に控えてバージョンアップを余儀なくされたので対応内容を後世のために記しておきます。
## アプリケーションの構成概要
“`
Ruby: 2.6.3
Rails: 5.1.7DB: PostgreSQL
開発環境: Mac、Windows
本番環境: Heroku (Heroku-18)
“`なお、Railsは **APIモード** で実行しています。
“`
[config/application.rb]
config.api_only = true
“`## 経緯
Herokuのstackの `Heroku-18` が来年の2023年5月1日でデプロイが行えなくなります。
当初は1つ上の `Heroku-20` への対応を検討していたのですが2年後にまた `Heroku-22` 対応するのはしんどいので一気に `Heroku-22` に上げることを検討しました。## Heroku-22 に必要なもの
“`
Ruby: 3系 (デフォルトは3.1.x)
“`
Rails コメント+星機能
皆さんこんにちわ!!
今日もプログラミングしていますか?:point_up:
今回は詳細ページにコメント星機能をつけていく機能を紹介します!!
注意:大前提としていいね機能を実装していないと実装できません!!:sunny:
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738887/35e479f8-8aed-90ec-d256-c50979d5b2ae.png)
Step1:星機能(詳細ページ用)の中間テーブルとアソシエーションを組む!!! “`ruby:.ターミナル
rails g model Review eve:integer content:string user:references tweet:referencesrails db:migrate
“`Step2:userとtweetのモデルにアソシエーションの情報を打ち込む!!! “`ruby:app/models/user.
ControllerやModelからDecoratorのメソッドを呼ぶ
## 呼び方
`ActiveDecorator::Decorator.instance.decorate(インスタンス)`を使用する。
下記の方法でModelでもControllerでもDecoratorを使用できます。ex)`HogeController#new`で`HogeDecorator#hello`を使いたい場合。
“`rb
class HogeController < ApplicationController def new hoge = Hoge.new hoge_decorator = ActiveDecorator::Decorator.instance.decorate(hoge) hoge_decorator.hello # => Hello Worldが返ってくる
end
endmodule HogeDecorator
def hello
‘Hello World!’
end
end
“`
LoadError (cannot load such file — sassc)
Railsでscssを適用しようとしたらLoadError (cannot load such file — sassc)
“`ruby:application.html.erb
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
“`上記記載後、ブラウザで
cannot load such file — sassc
のエラーとなった。
原因
gemfile 中の gem “sassc-rails” がRails Ver7からはコメントアウトされており、インストール時に適用されないとのこと。
コメントアウト解除後、bundle install により無事解決
【Rails】I18n#lで日付のフォーマットを定義しよう
## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16## 日付のフォーマットを定義
“`config/locales/ja.yml
ja:
date:
formats:
default: “%Y.%m.%d”
long: “%Y年%m月%d日”
short: “%m月%d日”
time:
formats:
default: “%Y/%m/%d %H:%M:%S”
long: “%Y年%m月%d日(%a) %H時%M分%S秒 %z”
short: “%y/%m/%d %H:%M”
date_long: “%Y年%m月%d日”
date_short: “%m月%d日”
datetime: “%Y.%m.%d %H時%M分”
only_time: “%H:%M”
“`
デフォルトの形は引数の指定なし、それ以外は第2引数を指定するとデフォルト以外のフォーマットに変換できる。“`ruby
I18n.l
railsのedit画面から確認(confirm)画面を挟んでupdateしようとしてエラーにハマった話
>どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼
Tweets by takeshi_program## 1. エラー状況
アプリ制作中にedit画面からconfirmアクションに遷移したら`couldn’t find Feed with ‘id’=confirm`というエラーが発生してしまいました。?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534058/dfcdecb2-a8ff-b805-0a1c-bbe9062ef641.png)new画面からconfirmアクションに遷移するときはこのようなエラーは発生せず遷移できたのですが…?
まず、不可解な点はidの中に通常、番号が入るところが、cofirmという文字列が入ってしまっている点です。
このとっかかりから原因を突き止めることができました。`コード`と`confirmにパラメータ渡すときのlog`を以下に載せておきますので、皆さんも考
【超簡単】Rails 日ごとに投稿をまとめ詳細ページに表示する
# はじめに
日ごとに投稿を1つのリンクにまとめ、その遷移先にその日の投稿がまとまったページを作成する方法を伝授します!
コピペだけで実装できます!
(※実装しているものと若干合わせる必要はあると思います?)## コントローラー
“`ruby:posts_controller.rb
class TweetsController < ApplicationController def index @tweet = Tweet.new @tweets = Tweet.group("date(created_at)") end def create tweet = Tweet.new(tweet_params) if tweet.save redirect_to :action => “index”
else
redirect_to :action => “index”
end
enddef show
@date = params[:date]
@tweets = T
Railsのデータベースコマンドこれさえ見れば問題なし!
## 概要
Railsアプリでデータベースをmigrateする際の有用なコマンドをこの記事にまとめる。## migrateコマンドまとめ
### ファイル作成コマンド
– マイグレーションファイル作成
`rails g migration クラス名`
“`
$ rails g migration CreateUsers
Running via Spring preloader in process 310
invoke active_record
create db/migrate/20220913055401_create_users.rb
“`– モデルファイル作成
`rails g model モデル名`
“`
$ rails g migration User
Running via Spring preloader in process 315
invoke active_record
identical db/migrate/20220913055401_create_users.rb
【Rails】onclick属性を指定してもJSの関数が使えない
# やりたいこと
ビューファイルに直接書いたJavaScriptをapp/javascript/packs/application.jsファイルに移行したい。“`slim:app/views/**s/**.html.slim
javascript:
function hoge(target) {
〜処理〜
}input type=”button” value=”hoge” onclick=”hoge(this)”
“`# 上手くいかない
JavaScript部分をそのまま切り取ってapp/javascript/packs/application.jsファイルに移行すると今まで動いていたのに、動かなくなってしまう。# [teratail](https://teratail.com/questions/343393)で解決法を発見
> 記述したjavascriptが関数でラッピングされてる可能性があるので、HTML側から呼び出せないのかもしれません。
関数をonclickで呼び出したいならglobal領域に突っ込んであげると上手くいくかもしれません。
【Rails】deviseの導入とログイン機構作成時のメモ
# deviseの導入手順
Gemfileに以下を記述。devi**c**eではなく、devi**s**eなのでご注意を。
“`ruby:Gemfile
gem ‘devise’
“`
ターミナルで以下を実行し、gemのインストール。
“`
bundle install
“`
以下のコマンドを実行し、設定ファイルを作成。
“`
$ rails g devise:install
“`
以下のコマンドを実行しモデルの作成とマイグレート
“`
$ rails g devise user$ rake db:migrate
“`ログイン機構が表示されるかどうかを確認するため、以下のようなviewをapp/views配下に作成してみる。
“`erb:home/show
HOME
<% if user_signed_in? %>
メールアドレス: <%= current_user.email %>
<%= link_to "ログアウト", destroy_user_session_path, method: :dele
単体テストコード(userモデル)記述の流れ
# はじめに
単体テストコードを実行する流れをまとめる# 単体テストコード実行流れ
## 1.テストコードを記載するファイルを作成する。
% rails g rspec:model user
(Userモデル用のテストファイルを作成できる。)「create spec/models/user_spec.rb」と記載が出れば問題ない。
<補足>
RSpecでモデル、ビュー、コントローラーのテストを行うためには、rails_helper.rbというファイルを読み込む必要があるため、
上記で作成したテストファイルの1行目にはrequire ‘rails_helper’と記述されている。## 2.テストコードを記載
#userモデルの単体テストコードの一例(spec/models/user_spec.rb内)
require ‘rails_helper’
RSpec.describe User, type: :model do
before do
@
[Rails]複数キーワードで動的にLIKE句のOR検索をする方法
今回は実務で使う機会があったちょっとしたことについての記事です
## やりたいこと
“`ruby
# keywords = [“hoge”, “fuga”, “piyo”]
Post.where(“title LIKE ?”, “%hoge%”)
.or(Post.where(“title LIKE ?”, “%fuga%”))
.or(Post.where(“title LIKE ?”, “%piyo%”))
“`上記のように複数キーワードを渡したときに、いずれかのキーワードを含むPostを検索したい。
## やり方
先に結論を書きますと、以下のようなScopeを作って対応しました
“`ruby
class Post < ApplicationRecord scope :by_keywords, lambda { |keywords| keywords.map { |keyword| where("content LIKE ?", "%#{keyword}%") }.reduce(:or) } end keywords = ["ho
[rails初心者]複数権限でのログインを使ったレビューサイトの作成(応用)
初めに
ポートフォリオテーマとして業者のレビューサイトを作成しています。
以下の画像のようなレビューサイトを作っていこうと思います。![top画面1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822721/75cffe6d-1714-fc3c-9ad8-068addf06205.png)
※自分用でまとめてますので、分かり辛かったらすいません。
また理解不足・誤りがあったらコメント頂けますと幸いです。m(__)m<ヨロシクオネガイシマス前提条件
①今回の記事では応用機能のみ※平均値算出や平均点が大きい順に並び替えについて紹介いたします
②今回の記事では基本機能は実装済みとして進めます。詳しくは下記URLより参考にしてください[[rails初心者]複数権限でのログインを使ったレビューサイトの作成(基本)](https://qiita.com/about10/items/0e376c84022f2ac238d0)
Fly.ioでデプロイする手順(Window)
参考サイト:https://qiita.com/00000000/items/237ee0fba66ca5a3f12e
# STEP1:Gitを利用できるようにしよう
Gitを利用するためにユーザー名とemailを登録する必要があります。
以下のコマンドの”名前”と”メールアドレス”の部分を変更して、実行してください!
名前は自分の氏名のローマ字で大丈夫です。“`ruby:ターミナル
git config –global user.name “名前”
“`“`ruby:ターミナル
git config –global user.email “メールアドレス”
“`# STEP2:リリースするための準備を仕込もう
“`ruby:ターミナル
cd desktop
cd (自分のアプリのフォルダ名)
“`
## Gemfileの編集
まず、「gem ‘sqlite3’, ‘~> 1.4’」と書いてある行(9行目付近にあります)を
コメントアウトしましょう。
(これらは、自分のパソコンの中のrails app内で用いるデータベースのgemです。)#
Render.comでRailsアプリの本番環境を作成する方法をどこよりも優しく伝える!
# 目的
Herokuの有料化により他のPaasを探している方もいるのではないでしょうか?
本記事は [Render.com](https://render.com/) というサービスを本番環境に使用する方向けの記事です。前記事からの続編となっていますので、
+ 本番環境だけPostgreSQLにする
+ Railsアプリの環境変数を設定するという方法を知りたい方は下の記事を御覧ください。
https://qiita.com/ysk91_engineer/items/904a5bc881eda8a10df8
:::note
現在Webエンジニアを目指して勉強中の、現場未経験の僕でもできた工程です。
ハンズオンでゆっくりやっていきましょう。
:::# 準備
## scaffoldでささっとUserモデルを作る
本番環境でdbが動いているかを確認するために、簡単なMVC構造を作成しましょう。
ターミナルにて“`terminal
$ rails g scaffold User name:string
$ rails db:migrate
“`
を実行し、Userモ
【解決済】CORS設定でOPTIONSリクエストとヘッダが取得できない
実装中に対応した内容を備忘録として投稿します。
## 発生した問題
フロントエンド(Nuxt.js)から、バックエンド(Rails)に対して、APIリクエストを投げるとCORSエラーが発生。“`
Access to XMLHttpRequest at ‘http://localhost:3000/users/1’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
“`## 原因
– ブラウザ側のセキュリティが強化されていて、意図しない挙動を防ぐために実装されている。
– もし仮に、ハッキングされるなどすると、
– フロントエンドとバックエンドでサーバーやドメインが別れている場合に、悪意のあるドメインにすり替えるなどができてしまう。
– 会員制サイトでログインするときに、ログインIDやパスワードを盗むことができてしまう
今まで知らなかった開発で使用するメソッドをまとめてみた!
## なぜ記事を書こうと思ったか
Railsアプリの開発をする際に適切なメソッドを調べる時がある為、今まで知らなかった開発で使用するメソッドを中心にこの記事にまとめようと思います。## railsメソッド一覧
### Regexpクラス– escapeメソッド
メタ文字をエスケープした結果を返す。“`
pattern = Regexp.escape(‘1+2=3,2*3=6’)
p pattern
# ‘1//+2=3,2//*3=6’
“`### Stringクラス
– subメソッド
文字列中で pattern にマッチした最初の部分を文字列 replace で置き換えた文字列を生成して返す。“`
greeting = “I am name. My favorite food is meet.”
pattern = { “name” => “James”, “meet” => “beef” }
replaced = article.sub(/name|meet/, pattern)p replaced # “I am James. M
【備忘録】【Rails】before_actionとは
11月からRailsを実務で使うことが決まったので、これから学習したことを備忘録に残していきます。
今日は【before_action】について。
▼ 参考にさせていただいた記事
[pikawaka 【Rails】 before_actionの使い方とオプションについて](https://pikawaka.com/rails/before_action)# before_actionとは
コントローラの各アクションが実行される前に、何らかの処理を行いたい時に使用するもの。
フィルタの一つ。フィルタとは、コントローラにあるアクションの直前や直後、または直前と直後の両方に実行されるメソッドのことをいい、Railsには様々なフィルタが用意されている。“`rails:before_actionの使用例
class UsersController < ApplicationController before_action :メソッド名 end ``` これをコントローラーファイルの上部に記述しておくことで、コントローラーのアクションが動く前にメソッドが実行されて、そのあとでア
Deviseのエラーメッセージを日本語化する
# Devise日本語化の設定
application.rbを編集して、言語設定を変更する下記の様にconfig/application.rbの中に**config.i18n.default_locale = :ja**を追記する。
“`ruby:config/application.rb
module ——-
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.0 # 日本語の言語設定 config.i18n.default_locale = :ja # Settings in config/environments/* take precedence over those specified here. # Application configuration can go into files
ビューテンプレートについて
### パスとURLヘルパーメソッド
ルーティングを表示する際のPrefixの値+_pathなどとするとルーティングで定義したパスが取得可能になります。以下例になります。
次のようなルーティングを表示した場合のprefix欄にあたる
**publisher**や**edit_profile**の名前を使ってURLやパスを生成できます。
“`
Prefix Verd URI Pattern Controller#Actionpublisher GET /publishers/:id(.:format) publisher#show
edit_profile GET /profile/edit(.:format) profiles#edit
“`上記のPrefix値に_pathを付けると
ドメインやポートなどを除いた/から始まるパス部分を、
_urlとするとドメインなどを含んだ安全なURLを返します。また、publsiherのようなパスの情報に「:id」といった変動