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

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

resources :~, only: %i[index] の”%i”は何者なのか

はじめに

ポートフォリオ作成で参考にしたコードで、ルーティングの設定を記述する際に”%i”という文字列が出てきて、どんな意味が分からなかったので調べたものを備忘録として残そうと思います。

%iとは何者なのか

どうやら、”%i”は「%記法」(パーセント記法)という形式の記法の中の一つのようです。

%iを使用することによって、シンボルの配列を作成してくれます。

https://railsdoc.com/page/symbol_info

例を見た方がイメージが湧くかもしれません。

~~~
例:
%i[red blue yellow white black]
# 下記の配列が作成される
[:red :blue :yellow :white :black]
~~~

%iを使用することにより、”:”を記述せずに配列を作り使用することができるということでした。

なので、今回の最初に疑問を持った式を使用すると、下記のようになります。
“:”を書く手間を省いたと言うことですね。
~~~
resources :~, only: %i[index]
#下記を書いていることと同義

元記事を表示

【jQuery】ドロップダウンの開閉(クラスの変化)をトリガーにCSSの変更を動的に実装

# はじめに
ドロップダウンを開いた時に、cssを変更する操作を動的に行いたい。
railsのアプリ環境で行う。

# 環境
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |
4|jquery-rails|4.5.0
# 実装
[こちら](https://ayaka-weblog.com/programming/html-css-programming/wai-area-accordion/)の記事を参考にjsファイルを書いた。

# jsファイル読み込み設定
全ページにjsファイルを読み込むように設定する。
“`app/javascript/packs/application.js
// app/javascript を起点に記載
require (‘user/dropdown’)
“`

元記事を表示

【Rails】class有りの名前付きルートの使い方

# class有りの名前付きルートにする際の注意点
Usersコントローラーのnewアクションを作成し、Signupのリンクにする場合 。
“`ruby:routes.rb
get ‘users/new’
“`
erbでは生のHTMLを記載することが可能。
“`ruby:views/static_pages/home.html.erb

“`
users/newページへのURLをRails流にする際にSyntaxErrorがでることがある。
## 解決策
デフォルトのルーティングはやや回りくどいので名前付きルートを定義する。
“`ruby:routes.rb
get ‘/signup’, to: ‘users#new’
“`
link_toの後に””を付けて文字列にすること、class: “btn signup”がシンボルになることに注意する。
“`ruby:views/static_pages/home.html.erb
<%= link_to "Sig

元記事を表示

なぜcreateメソッドのparamsのみparams.requireメソッドが代入されるのか。

理解が曖昧だったため、整理のために記事を投稿。

それは**createメソッド**とそれ以外において、役割が異なるためである。
また、ここでは、newとindexメソッドは省く。

**createメソッド**の役割は、newのviewにおいて記載され、**ストロングパラメーター**となった(許可された)情報を取得し、保存することにある。
そのため、データベースのテーブルから、レコードを一つ取り出すメソッドであるfind(params[:id])は使えない。
そのため、**createメソッドに対し、params.requireの中身を代入すること**になる。

“`ruby:task.controller.rb

def create
@task=Task.new(task_params)
if @task.save
redirect_to tasks_path, notice: “作成しました”
else
render ‘new’
end
end

private

元記事を表示

JSONを受け渡しするRails APIのrequest specの書き方

# はじめに
一部React化で久しぶりにAPIを作成しました
JSONを受け渡しするRails APIのrequest specの書き方まとめです :sparkles:

## headersにContent-Typeを追加する
headersに`’Content-Type’ => ‘application/json’`を追加する
これでJSONのparamsを渡すことができるようになります

追加しないとデフォルトでは
`”CONTENT_TYPE”=>”multipart/form-data”`となり
数値やbooleanが文字列に変換されてしまいます
“`rb
describe ‘PATCH #update’ do
subject { patch xxx_path(article), headers: { “Content-Type” => “application/json” } }

end
“`

## JSONのparamsを用意する
“`rb
let!(:params) { { name: ‘タイトル’, body: ‘本文’ }

元記事を表示

RubyInstaller 3.1.2-1はまずgem install bundlerしましょう

言いたいことはタイトルで完了したので以下発生した問題と原因・解決方法です。

# 問題:rails newが通らない

ちょいと検証したいことがあって`rails new`しようと思い、devkitなしのバージョン入れてたことに気づいて(ネイティブライブラリビルドするgemがインストールエラーになって)、ついでなのでRubyInstallerでRuby 3.1.2を入れました。

で、`rails new`したところ、`bundle install`は通ったもののその後の処理でエラーが出てしまいました。

“`
rails importmap:install
rails aborted!
TZInfo::DataSourceNotFound: tzinfo-data is not present. Please add gem ‘tzinfo-data’ to your Gemfile and run bundle install
C:/TEMP/sample_app/config/environment.rb:5:in `

Caused by:
TZ

元記事を表示

【Rails】ヘッダーのドロップダウンをレスポンシブ対応

# はじめに
[こちら](https://qiita.com/vaza__ta/items/921b748df585bbbb4300)の記事で、ヘッダーをレスポンシブ対応するため、overflow-x: autoを実装した。
それにより表示領域から溢れた時はスクロールバーが表示されるようになった。

しかし、それによってドロップダウンの表示もスクロールバーが表示されるようになってしまった。
![scroll1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/c1bfb901-6074-ca79-6b91-1229582efdc9.gif)

そこで、スクロールバーに対応するoverflow-xの適応を、ウィンドウサイズの横幅が750px以下の時にのみにすることにした。理由としては下記となる。
・約770px以下からbootstrapによってヘッダーの表示フォーマットが変わる
・それ以下の750px以下であれば、overflowを設定してもドロップダウンがスクロールバー表示にならない
![s

元記事を表示

【Rails】gemのkaminariと配列を併用する場合について

## はじめに
ページネーションを実装する時にkaminariを使用することが多いと思います。
しかし、その前に取得したレコードを操作して配列になっていたりすると、そのまま`.page(params[:page])`を適用させることはできません。
このようなケースが個人開発であったのですが、応用的な使い方を知らず少々つまずいたので、今回記事に残しておくことにしました。

## やりたいこと
– Itemモデル全体をシャッフルして表示する
– 表示は、ページネーション対応で1ページに5個までにする
– kaminariのインストールは[こちら](https://qiita.com/you8/items/df68aaee3010e282d1ae)が参考になります

## 開発環境
Ruby 3.1.2
Rails 6.1.6

## 実装
そもそもページネーションを適用しないのであれば、shuffleメソッドを使用するだけで完了します。
“`ruby:items_controller.rb

def index
@items = Item.all.shuffle
end

.

元記事を表示

【Ruby】Faebook広告のデータをAPIで取得する

# 環境

Ruby 2.6.6
Rails 6.0.4.7
Gem facebookbusiness(Metaが出している公式のSDK)
(※ ググるとgem ‘facebook_ads’などが出てくるが、そちらではないことに注意)
API version v14.0(2022年8月最新)

# やりたいこと
1. Meta for DeveloperのAppにアクセス許可を渡しているすべての広告アカウントを取得する
2. それぞれの広告アカウントの、昨日のパフォーマンス(インプレッション、クリック、コストなど)を取得する

# ビジネスのちょっとした背景

ウチの会社はweb広告に力を入れていて、すべての事業のfacebook 広告アカウントを足すと使っていないものも含めて80アカウントくらいある…。(広告代理店かってくらい)

以前は各アカウントの担当者が毎日毎日手作業でgoogle spreadsheetに情報を入力して、ピボットやシートの連携で集計して、目視で確認して…とだいぶ作業が煩雑になっていた。それを、facebookのapiを叩いてspreadsheetの入力まで自動

元記事を表示

i18n

# セッティング
“`application.rb
module BooksApp
class Application < Rails::Application config.load_defaults 6.1 # デフォルト設定言語 config.i18n.default_locale = :ja end end ``` # 言語登録 ```ja.yml ja: greeting: "こんにちは。" title: "タイトル" memo: "メモ" author: "著者" picture: "画像" new: "新規作成" show: "表示" edit: "編集" destroy: "削除" back: "戻る" create: "作成" update: "アップデート" ``` # 表示方法 ```hoge.erb <%= t('greeting') %>
“`

元記事を表示

[Rails・Heroku]HerokuでWheneverが機能しない場合の対処

### 前提
記事を書いている私は現役のエンジニアではなくエンジニアを目指して学習中の者です。
よって、気をつけてはいますが記述内容には誤った内容が含まれている危険性があります。
その為この記事は参考程度に読んで頂き詳しい内容は公式の記述を参考にすることをおすすめします。

### この記事で実装すること
個人開発のアプリで**gem:whenever**を使用して定期処理を実行しようとしたが動作しなくて困ったのでその時の対処をまとめました。
具体的にはHerokuでは**gem:whenever**はサポートされていないらしいのでHerokuのアドオンである**scheduler**を使用して定期処理を実行させるように変更しました。

### 使用技術
Ruby 3.1.2
Rails 6.1.6
Heroku

### 実装手順
##### 1, 定期実行させたい処理をrakeタスクとして作成する
gemのwheneverでもHerokuのschedulerでもまずは実行するrakeタスクを作成する必要があります。
rakeタスクは以下のコマンドを実行することで作成できます。
t

元記事を表示

100日後くらいに個人開発するぞ!day070

## 今日は配列の変数を使った一覧ページの表示をやってみた!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/506e5ce2-15e6-d404-2662-50a4cfff8f6b.png)

## 今日の学び

### viewファイル内で変数を定義して表示する
* erbファイルでは`<% %>`で囲むことでHTMLファイル内にRubyのコードを記述できる
* erbは「Embedded Ruby(埋め込みRuby)」の略
* 埋め込んだRuby Codeをブラウザに表示したい場合は`<%=変数%>`を用いる

### <%%>と<%=%>
* `<%%>`の場合は何も表示されないので変数の定義などに用いる
* `<%=%>`はRubyコードの中身が表示されるので変数の値などを表示したい場合に用いる

### 投稿データを入れる配列
* コンマで要素を区切ることで複数の要素を配列に代入できる
* 例:変数postsに複数のデータを入れる

元記事を表示

coc.nvim + efm-langserver でerbファイルの文法チェックをおこなう

# Vimで.erbファイルを書きたい

Rails7のHotwireを試したくて、(nvimで)何年かぶりにeRubyを書いてみてるのだけど、eRuby向けのLanguage Serverが見当たらなくて泣きそうになった。
せめて文法エラーのチェックくらいはできたら・・・[^1]
[^1]: Ruby自体のLanguage Serverは[solargraph](https://solargraph.org/)というのがあり、だましだましだが[Railsもサポートされている](https://solargraph.org/guides/rails)

そこで、どんなコマンドでもLanguage Serverにしてしまえる `efm-langserver` を使ってみることにした。

https://github.com/mattn/efm-langserver

efm-langserverのREADMEには、

“`yaml
lint-command: ‘erb -x -T – | ruby -c’
“`

と[書いてある](https://github.com/mattn/e

元記事を表示

Fakerが理解不足でエラーが出たので調べてみた

はじめに

タイトルの通り、RspecでダミーデータをFakerを用いて作成しようとしたところ、単純な理解不足でエラーが起きて一瞬詰まったので備忘録として残します。
同じようなミスをしている人がもしかしたらいるかもしれないので!!

行いたかったこと

user_name(ユーザー名)のダミーデータを作成がしたくて、下記のように記述したのですが、”国際化エラー:翻訳に失敗しました”というようなエラーが返ってきてしまいました。

~~~
FactoryBot.define do
factory :user do
user_name { Faker::Name.user_name }
#user_nameのダミーデータを作成したかったがエラーが発生
~省略~
end
end
~~~

~~~
#返ってきたエラー
I18n::MissingTranslationData:
translation missing: en.faker.name.user_name
~~~

ネットでエラーについて調べたところ、翻訳ミスなのでconfig/

元記事を表示

Rails7 x Mysql8 Dockerで環境構築をする

## はじめに
Docker環境構築に1日使ってしまい苦労したのでまとめてみる。
環境構築時の知識は`Dockerfile`や`docker-compose.yml`を読めば何をしているのか理解できる。
基本的なコマンドは知っている
`PHP x Mysql`のDocker環境を過去に作ったことがある。

## 環境と前提
Mac M1
Rial7とMysql8で環境を作成する
Vも含めたフルスタック想定で環境を組むが、途中の注釈通り`–api`をつけるだけでapiモードで開発可能

## 環境構築をしていく
適宜コメントで説明を入れていきます。
*必要ファイル*
大体どんな記事でもこの構成だと思う
“`
Dockerfile
docker-compose.yml
Gemfile
Gemfile.lock
entrypoint.sh
“`

*Dockerfile*

“`rb
# Docker-hubのImageをベースとして利用します。
# Docker-hubにログインしていないとダウンロードできないので気をつける
FROM ruby:3.1

# Dockerコンテナ内

元記事を表示

Gemfile.lockのexclamation mark (!)

## Gemfile.lockのDEPENDENCIESの!
自前のgemサーバーを立てたプロジェクトでGemfileを修正したところ、Gemfile.lockのDEPENDENCIESに!が差分として入るようになったのでその理由を調べてみた。

一応それらしい情報は見つかったものの、説明にバラツキがあり今一つピンと来ない。
https://stackoverflow.com/questions/7517524/understanding-the-gemfile-lock-file

## Bundlerは一体何をやっているのか?
仕方ないのでbundlerのソースを確認してみると、こんな感じで!を付けてました。
“`ruby:lib/bundler/dependency.rb
def to_lock
out = super
out << "!" if source out << "\n" end ``` sourceの判定 ```ruby:lib/bundler/rubygems_ext.rb def source

元記事を表示

[Rails6・S3]ActiveStorageを使って画像をダイレクトアップロードする

### 前提
記事を書いている私は現役のエンジニアではなくエンジニアを目指して学習中の者です。
よって、気をつけてはいますが記述内容には誤った内容が含まれている危険性があります。
その為この記事は参考程度に読んで頂き詳しい内容は公式の記述を参考にすることをおすすめします。

### この記事で実装すること
Rails6系でActiveStorageを使用してS3に画像をダイレクトアップロードする手順を説明します。
Railsアプリで画像を複数枚アップロードする機能を実装すると思っていたよりアップロードに時間がかかってしまいます。
そこでダイレクトアップロードを実装するとアップロードにかかる時間を大幅に削減することができます。

### 使用技術
Ruby 3.1.2
Rails 6.1.6
Heroku

### 実装手順
Active StorageはRailsにデフォルトである画像投稿のための機能なので詳しい情報はRailsガイド等も参考にしてみてください。
[Railsガイド](https://railsguides.jp/active_storage_overview.html

元記事を表示

gem cocoon rails6使い方

## 初めに

今回この記事では、gemのcocoonの簡単なチュートリアルを紹介してきます。
この記事ではあくまで簡単なチュートリアルを動かすことを目的として作成しています。
公式のgithubのreadmeではhtmlファイルがhamlで作成されているのでhamlを学習しておらず詰まってしまっている方に向けて作成しています。

github Readme↓
https://github.com/nathanvda/cocoon

上記のreadmeを日本語訳してくれている記事↓
https://note.com/emetselch1984/n/neb1396b86126

## 実装環境
ruby 3.1.2
rails 6.1.6.1

## 完成図
![Screen_Recording_0004-08-17_at_16_48_12_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1717562/77687a3c-d545-ad09-6a4d-ee8d0b721a8c.gi

元記事を表示

スネークケースのモデル名でしくじった話

## 環境
Rails5.2
Ubuntu20.4

## はじめに
モデル名の名前の付け方をしくじって、トラブル解決に時間をかけてしまった話です。始めに、モデル名に次のような、スネークケースの形式で名前を付けました。
“`
rails g model Test_Test_1
“`

何がいけなかったのかといえば、数字の前にアンダーバーをつけてしまったことです。なぜ、テーブル名の末尾に数字を使ったのかといえば、Test_Test_1、Test_Test_2、Test_Test_3と、いった具合に、同じテーブル名にして、連番を付けたかったためです。

このようなモデル名でテーブルを作成した後、コントローラーからそのモデルのクラスを呼び出したとき、つぎのようなエラーが発生しました。
“`
uninitialized constant
“`

つまり、そのような名前のクラスは存在しませんというエラーです。いや、あるんですが・・・と思っていたのですが、原因は、モデルの名前の付け方にありました。

結論を言うと、モデル名をTest_Test_1ではなく、Test_Test1で作り変えると

元記事を表示

僕がハマったRailsのsave(context: hoge)の落とし穴

## 落とし穴
備忘録です。

saveメソッドの引数にcontextを渡す処理があったとします。

“`ruby:user_controller.rb
def update
#
#
user.save(context: :hoge)
#
#
end
“`

なぜなら一部のバリデーションをスキップしたいから。

“`ruby:user.rb
class User < ApplicationRecord # 処理1 before_validation :set_bar, unless: -> { validation_context == :hoge }

# 処理2
validate :validate_foo, on: :update
def validate_foo
# バリデーション処理
end
end
“`

この例では、user.save(context: :hoge)の時にbefore_validationを走らせたくないけど、他のバリデーションはやって欲しいという意図。saveでcontextは指定しているけど

元記事を表示

OTHERカテゴリの最新記事