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

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

rails二重投稿防止の注意点

## 事象

* railsではformで送信時にvalidateなどのメッセージを出せるが、
* そのvalidateメッセージ表示周りがdivで囲まれ
* レイアウトが崩れる場合がある

## 対策
* もしview周りはデザイナーが担当しており
* cssの指定が `.class > p + span` などのように **子、隣接結合子**などを使って書かれている場合
* デザイナーに**BEM記法**などで書き直してもらう必要がある

## よくあるその場しのぎ

* レイアウトが崩れるので、validate周りをdivで囲まないようにする為、configに以下を書いている場合

“`ruby
# 二重送信対策解除
config.action_view.automatically_disable_submit_tag = false
“`

* もちろんこれだと二重送信防止が解除される為解決にならない

* [二重送信防止方法はこちら](https://rails.densan-labs.net/form/double_submit_protection.html)

元記事を表示

gemを使ってスクレイピングしてみた

# はじめに
本記事は、[2021 RUNTEQアドベントカレンダー](https://qiita.com/advent-calendar/2021/runteq)5日目の記事になります!
現在ポートフォリオを作成しており、その作成過程でスクレイピングを用いて必要な情報を取得しDBに格納しました。今回はそこで使用した**gem Mechanize**について書いていこうと思います!

# この記事でわかること

**gem Mechanizeについて**

– できること
– 提供しているメソッド
– PFで用いたDBに格納する方法

##できること

まず概要を[公式](https://github.com/sparklemotion/mechanize)より見てみます

> Mechanizeライブラリは、ウェブサイトとの対話を自動化するために使用されます。Mechanizeは、自動的にクッキーを保存、送信し、リダイレクトを行い、リンクをたどり、フォームを送信することができます。フォームフィールドは入力して送信することができます。また、

元記事を表示

【Rails】newメソッドとbuildメソッドの使い分け方【初学者の疑問点を簡潔に解説】

## はじめに
 本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
 今回の疑問点は、

  _`new`と`build`の使い分け_
 
 です。 

 以前、フォロー/フォロワー機能の実装の際に出てきて`newメソッド`との使い分けについて疑問を抱きました。
 今回、調べて見てわかったことをまとめます。
## 疑問点についての解説

###結論
 インスタンスを生成するメソッドという点では共通しているが、モデルの関連付けの際には`build`を使用する。

###buildメソッドの記述方法
 モデルの関連付けの際に使用すると記載しましたが、アソシエーションの状況によって記述の仕方が異なるようです。

####アソシエーションが1対1の場合

“`
@user = User.new
@card = @user.build_

元記事を表示

NoMethodError: undefined method `<<' for #

# 前提

![mandal-art-06.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653881/41007dc7-7cb4-2559-8997-87969c1adbbf.jpeg)

マンダラートのアプリを作っています。
マンダラートとはアイデア出しの手法の一つで
こんな感じで、連想してアイデアを出してくような感じ。

# エラーが起きた

“`ruby

class MandalartsController < ApplicationController def index # 最初から配列の要素を9つ入れとく # 配列の要素の中身があれば、何もしない # 配列の要素の中身があれば、""の要素を入れとく @mandalarts = Mandalart.all binding.pry if @mandalarts.count < $mandalart_blocks_num ($mandalart_blocks_num

元記事を表示

Rails 掲示板の編集、削除機能の実装 解説

#コントローラーに編集と削除を追加
###ルーティングの設定

“`rb:config/routes.rb
Rails.application.routes.draw do
root ‘static_pages#top’

get ‘login’, to: ‘user_sessions#new’
post ‘login’, to: ‘user_sessions#create’
delete ‘logout’, to: ‘user_sessions#destroy’

resources :users, only: %i[new create]
resources :boards do
resources :comments, only: %i[create], shallow: true
end
end
“`
・前回はonly: %i[index new create show] で、4つ指定したいたが今回は「destroy」「edit」「update」を加えるのでonlyで範囲を指定をしない。

###boardコントローラーの設定

“`r

元記事を表示

【オブジェクト指向】ポリモーフィズム

##ポリモーフィズムとは
意味:多相性、多態性

プログラミング言語の持つ性質の一つで、ある関数やメソッドなどが、引数や返り値の数やデータ型などの異なる複数の実装を持ち、呼び出し時に使い分けるようにできること。
**多態性の概念がない言語では、同名のプログラムが二重に定義されていますとエラーが出てくる。**

https://e-words.jp/w/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0.html

– dogもcatも同じcryメソッドを呼び出しているが、呼び出し先に応じて適切なメソッドを実行している。

“`ruby
class Animal
attr_accessor :name

def cry(voice=”)
“#{self.name}: #{voice}”
end
end

class Dog < Animal def cry(voice='わんわん') super end end class Cat < Animal

元記事を表示

bootsnapの「wrong argument type false (expected Symbol) (TypeError)」エラーで「bundle exec」コマンドが使えない場合の対処法

## 背景

自分は普段、Github Actions で CI/CD 環境を作る事が多いのですが、つい先日、新たなコミットを push してビルドおよびテストを実行した結果、なぜか途中でコケるようになってしまいました。

具体的に言うと、「bundle exec」コマンドを使おうとするタイミングで

`to_binary’: wrong argument type false (expected Symbol) (TypeError)`

エラーが発生するようになってしまった感じです。

“`
▶︎ Run bundle exec rails db:create
bundle exec rails db:create
bundle exec rails db:migrate
shell: sh -e {0}
/__w/myapp/vendor/bundle/ruby/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/compile_cache/iseq.rb:13:in `to_binary’: wrong argument type fal

元記事を表示

【Rails】TimeWithZoneクラスとは

##TimeWithZoneクラス
– Rails独自のクラスで、Timeクラスと完全な互換性がある。ただし、実装としてはTimeクラスを継承して作られているわけではない。(親クラスはObject)
– Timeクラスよりもタイムゾーンを柔軟に扱うことができる。
– TimeWithZoneクラスのインスタンスはnewではなく、以下のような方法で取得するのが望ましい。

“`ruby
Time.zone = ‘Eastern Time (US & Canada)’ # => ‘Eastern Time (US & Canada)’
Time.zone.local(2007, 2, 10, 15, 30, 45) # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
Time.zone.parse(‘2007-02-10 15:30:45’) # => Sat, 10 Feb 2007 15:30:45.000000000 EST -05:00
Time.zone.at(1171139445

元記事を表示

[Rails]DELETEリンクでpreventDefaultが効かない

### 環境
ruby 2.6.5
Rails 6.0.4.1
[sweetalert2](https://sweetalert2.github.io/#configuration)(CDN)

### 実装したい機能
削除ボタンを押すと、ブラウザに警告アラートを出す。
OKを押すと削除され、Cancelを押すと、元の画面に戻る。

イメージ↓
![cation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/64d5c09d-943f-df06-f2e7-fbffaad5208e.png)

### 実装方法
削除リンク要素をgetElementByIdで取得。
クリックイベント内でpreventDefaultを使用し、削除イベントを中止。
sweetalert2を使用して、警告アラートを表示。
OKが押された場合のみ、削除処理を進める。

### 生じた問題
Railsのヘルパーメソッドであるlink_toで削除リンクを実装した場合、
JavascriptのpreventDefaul

元記事を表示

rakeとシェルスクリプトを使って、複数DBへのデータインポートを効率化する

初めまして、kouです!
いつもは社内アカウントでqiitaを書いているのですが、今回は気分転換に個人アカウントで記事を書いていきたいと思います!

## 座学編

### rakeとは?
rubyで使用されるタスクランナーの一種。
実行したい処理をrubyで書いてタスクとして登録し、登録したタスクをrakeコマンドで実行する。
→ 一旦rakeタスクに登録しておけば、コマンドを入力するだけで処理を実行してくれるのでかなり便利!

### シェルスクリプトとは?
> シェルスクリプトとは、シェルによって解釈・実行される一連の処理を記述したスクリプト。狭義では、Unixシェルで用いられるスクリプト言語を指します。
「スクリプト(script)」は「台本」という意味で、コンピュータに実行させたい処理を記述してコンピュータを動かせます。
この台本をテキストデータで用意したものがシェルスクリプトです。コマンド・インタプリタとも呼ばれています。
ref: https://udemy.benesse.co.jp/development/system/shellscript.html

→ エクセル

元記事を表示

Rails 掲示板詳細画面の追加/コメント機能の実装 解説

Rails 掲示板詳細画面の追加/コメント機能の実装 手順 (自分用)

#コメントモデルを作成する

“`rb:ターミナル
$ bundle exec rails generate model comment body:text user:references board:references
“`
・UserモデルとBordモデルを参照するようにCommentモデルを作る。

###マイグレーションファイル

“`rb:db/migrate/XXXXXXXXXXXXXX_create_comments.rb
class CreateComments < ActiveRecord::Migration[5.2] def change create_table :comments do |t| t.text :body, null: false #空にならないようにnull制約をfalseにする t.references :user, foreign_key: true t.references :board, foreign_ke

元記事を表示

【テーブル?】railsのモデルやデータベースが何をしているのか分からない人へ【migration?】

# 前説
DMM WebCampのAdvent Calendar2021の4日目を担当させていただきました、日置と申します。

Railsのモデルやデータベース関係で何をしているのか分からず困っている方向けに、railsにおけるデータの扱い方について説明していきたいと思います。よろしくお願いします。

### この記事の最終目標
1. テーブルの意味を理解する
1. migrationファイルル/schemaファイルと、rails db:~コマンドの役割を理解する
1. Modelとは何かを理解する
1. Modelの使い方を覚える

### 対象者
– Rubyの以下の基礎知識を把握している方
– 文字列の結合や数値の計算
– 変数
– メソッドと引数([参考](https://www.javadrive.jp/ruby/method/index3.html))
– RailsのModelが何をしているのか分からない方
– rails db:migrateが何をしているのか分からない方

### 目次
– テーブルの意味を理解する
– [RailsとD

元記事を表示

rswagを使ったテストファーストなAPI開発のフローを確認する

# 今回のゴール

チーム開発に必要な API 仕様をコードと乖離せずメンテナンスしていくフローの検討です。

rails で API を作る場合、controller にメソッドを定義してルーティング設定するだけで簡単にできますが、
チーム開発等ではフロントエンジニアにソースを確認してもらうのは現実的ではないため、その API の仕様をドキュメントで共有するかと思います。
方法としては swagger.yaml を書いて swagger ui で確認するというのがあります。
ただし swagger の書き方は若干慣れが必要ですし、API が修正されると実態とずれてしまうリスクがあります。
そこで rswag という rails で spec をかけばそれをもとに swagger.yaml を生成してくれる gem を使えば問題が解決するのではと考えました。
ここではその手順を記録していきます。

# rspec とは

rails用のテストライブラリです。
letを使って差分のみのテストパターンを簡単に作成できます。

# rswag とは

rspec を拡張して、swagger.

元記事を表示

コードの見方・関わり方が少し変わった一年でした、という話

グロービスにバックエンドエンジニアとして参画している @ymstshinichiro です。
僕は今年の5月から本格的に[GLOPLA LMS](https://glopla.globis.co.jp/)の開発にジョインしました。
本記事では、そこから今日までの7ヶ月を通して自分に起こった変化について書いてみたいと思います。

## 参画以前は
僕は約10年飲食の業界にいましたが、約4年前にキャリアチェンジで SIer > Web業界(社員) > Web業界(フリーランス) という流れで現在に至っており、新卒できちんと先輩から教わったとか、スクールで先生についてもらったみたいなことがありませんでした。

なので、基本的に独学でプログラミングを学び現場のコードを見ながら/直しながら覚えていくという感じでやってきており、

– 「こうあるべき」みたいなのは書籍を読んで得たものが基本
– とはいえ現場では現場のルールや状況がある
– 結果、その時々で対応していくので、背骨のある設計/実装、綺麗で汎用性の高いコード みたいなのがあまり身についてこなかった

という実感がありました。
一方で、急

元記事を表示

【再現性皆無】docker開発環境上での、ブラウザテストの設定

“`
bundle exec rails generate rspec:install
bin/rails g factory_bot:model mandalart
bin/rails g rspec:system mandalart
bin/rails g rspec:model mandalart
“`

いままでこれらのコマンドを入力してきました。

“`rb:spec/rails_helper.rb

+ require ‘capybara/rspec’
“`

“`rb:spec/rails_helper.rb

require ‘capybara/rspec’
“`

“`rb:spec/support/capybara.rb

equire ‘selenium-webdriver’
require ‘capybara/rspec’

Capybara.configure do |config|
config.default_driver = :chrome
config.javascript_driver = :chrome
config

元記事を表示

【Rails】ルーティングまとめ

###背景
学び始めでのルーティングをする際、getを使わなきゃだとか、resource、ヘルパーメソッドって何だったか…?となり毎回検索しては忘れてしまうのでここにまとめを。

###ルーティングのやり方
**◆個別設定**
1行ずつ設定する方法。1行1行手入力しないといけないので少し面倒。
一括設定する方法もある。

“`
get ‘URLに追加’ to: ‘コントローラのアクション’

例: get ‘index’ to: ‘posts#index’
これをURLにすると→ http://localhost:3000/index

“`

**◆一括設定**
resourcesを使う。
これらのメソッドは、railsで定義されている7つのアクションを自動で生成してれる。
 ▼7つのアクションとは

| アクション名 | 役割 |
|:-:|:-:|
| index | リソースの一覧を表示させる|
| show| リソースの詳細を表示させる|
| new| 投稿フォームを表示させる|
| create| リソースを追加させる|
| edit|

元記事を表示

[6行メモ] ActiveRecordのeagar_load後のwhere条件をControllerのParam値で動的に変更したい時

これは「[「はじめに」の Advent Calendar 2021](https://adventar.org/calendars/7037)」3日目の記事です。

Active Record 初心者が今日学んだこと。

“`ruby
result = Foo.where(name: params[:name])
.eager_load(:bars)
if params[:bar_name].present?
result.where(bars: { name: params[:bar_name] })
end

render :json => result
“`

※もっと良い方法があったら教えて下さい。

元記事を表示

マンダラートを作りたい #1

https://navi.dropbox.jp/mandal-art

![マンダラート](https://2fnflu14pimi44odtt128jit-wpengine.netdna-ssl.com/wp-content/uploads/2017/01/mandal-art-06.jpg)

マンダラートとはアイデア出しの手法の一つ。
こんな漢字で、連想してアイデアを出してく。

最初から、こんな漢字のマス目を用意して、投稿表示するのが意外と難しい。

投稿ページ、投稿一覧表示ページ、投稿編集ページを合体させたいのだが、それが意外と難しい。(大事なことなので2回言った)

“`ruby
class MandalartsController < ApplicationController def index @mandalarts = Mandalart.all new end def new @mandalart = Mandalart.new end def create @mandalart = Manda

元記事を表示

【Rails】gmailを使ってメールを送信しようとすると、Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted.とかいう地獄の対処法【Mailer】

症状

RailsのMailerを使い、gmailを通してメール送信設定をしようとしたところ、以下のエラーが表示されました。
翻訳すると「ユーザー名とパスワードは受け入れられません」でした

“`terminal
[ActiveJob] [ActionMailer::MailDeliveryJob] [af6c5cd6-78e7-40b7-a56f-8e982a58fa84] Error performing ActionMailer::MailDeliveryJob (Job ID: af6c5cd6-78e7-40b7-a56f-8e982a58fa84) from Async(mailers) in 1184.31ms: Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at
):
C:/Ruby30-x64/lib/ruby/3.0.0/net/smtp.rb:1015:in `check_auth_response’
C:/Ruby30

元記事を表示

【Rails】redirect_toとrenderの処理の違いについて【初学者の疑問点を簡潔に解説】

## はじめに
 本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
 今回の疑問点は、

  _`redirect_to`と`render`の処理の違い_
 
 です。 

 以前、バリデーションの設定を行った際に上記について疑問を抱きました。
 また、処理の違いをしっかりと理解しておかないとエラーの発生につながるので今回まとめていきます。

## 疑問点についての解説

###結論
結論から記載しますと`redirect_to`と`render`の処理はそれぞれ以下のようになります。

####redirect_toの処理の流れ

`①controller(redirect_to) → ②HTTPリクエスト → ③ルーティング → ④controller → ⑤view`

①controllerの処理で`redirect_t

元記事を表示

OTHERカテゴリの最新記事