Rails関連のことを調べてみた2020年09月13日

Rails関連のことを調べてみた2020年09月13日
目次

【Rails】content_tagを解説してみる。

忘備録的に書いていきます。間違っている点などありましたら、コメントしていただけるとありがたいです?‍♂️

# 【概要】content_tagとは

– Railsのview helperで使われる。
– HTMLコードの要素を生成することができる。

# 【何が嬉しいのか?】

HTMLコードを直に書くとセキュリティ面で脆弱性が出てしまうことがある。(XSS,CSRFであったり。)

上記のようなことを防ぐために、Railsに乗っていく(`content_tag`を使う)と**セキュリテイ面で恩恵を受ける**ことができます。

`HTML`と`erb`がごちゃごちゃになってしまう場合に整理して書けるというメリットもあります。

小さくパーシャル化するのにも使えるかもしれませんね。

# 【基本的な使い方】

“`rb
content_tag :p, ‘Hello, World!’ # =>

Hello, World!

“`

第一引数にタグを指定し、第二引数に`content`となる部分を埋め込む。

ちなみに、第二引数にはシンボル(`:p`みたいな)だけではなく、

元記事を表示

Rails 6で認証認可入り掲示板APIを構築する #8 seed実装

←[Rails 6で認証認可入り掲示板APIを構築する #7 update, destroy実装](https://qiita.com/rf_p/items/da70d93e821a44cea702)

# seedとは

開発中にテストデータが必要な時、都度`rails c`やらcreate actionを叩いてレコード作るのは手間です。
そこで、コマンドを叩くだけであらかじめ設定しておいたレコードを、50だろうが1000だろうが簡単に作れるseedを取り入れます。

# ファイル作成とロード

rails seedだけでググると大抵db/seeds.rbに直書きばかり出てきますが、modelが多くなると管理がしづらくなります。
そこでファイルを分割し、db/seeds.rbからrequireで呼ぶ形式にします。

こうすることで追加削除時の管理がしやすくなりますし、seedはファイル指定で実行することもできるので便利です。

“`powershell
$ mkdir db/seeds
$ touch db/seeds/post_seeds.rb
“`

“`rb:db/see

元記事を表示

Rails uninitialized constant エラーの解決へのシンプルなチェックリスト

# これはなにか
Railsをそれなりにやっているにも関わらず、uninitialized constant error にハマってしまったのでチェックリストをここにまとめておこうと思う。

# 結論
チェックするべき項目は以下3点である。

1. ファイル名とclass名が一致しているか?
– ファイルpathとmoduleの定義が一致しているか?
– Railsにファイルを読み込ませているか?

以下詳細をかいていく。

# ファイル名とclass名が一致しているか?

以下のようなclassが存在していたら、ファイル名は`qiita_user.rb` でないといけない。

“`rb
class QiitaUser
def hoge
end
end
“`

# ファイルpathとmoduleの定義が一致しているか?
以下のようなmoduleにnestされたclassが存在していたら、pathは `**/v1/auth/user.rb` のようになるだろう。

“`rb

class V1::Auth::User
end
“`

OR

“`rb

modul

元記事を表示

slimの長い構文を途中で改行する

Railsアプリ開発時にslimを使ってhtmlを書いているときに、このような長い構文がある。これを改行する方法。

“`slim
.card-toolbar
a.btn.btn-primary.status-editable data-confirm=”全ユーザーの編集権限を「編集可」に変更します。よろしいですか?” style=”font-size: 15px; margin: 0 10px;” href=”#{toggle_status_editable_admins_supplier_company_path(supplier_company_code: model.code, supplier_company_id: model.id)}” role=”button” 編集可
a.btn.btn-danger.status-editable data-confirm=”全ユーザーの編集権限を「編集可」に変更します。よろしいですか?” style=”font-size: 15px; margin: 0 10px;” href=”#{toggle_status_not

元記事を表示

[Rails]外部キー制限かかっているときにdestoryできないエラーを発生させたい時の対処

#はじめに
レコード削除時に関連づけられたレコードが存在するときに、例外やエラーを発生させたい。
外部キーで使用されていると親要素が消されては困るというシチュエーションです。

削除しようとするとRubyのエラー画面が出てしまう。
#原因
`Model`に関係づけされたモデルに対する挙動を定義するが無いからでした。
マイグレーションファイルの`foreign key: True`だけでは不十分でした。

#対策
`Model`に`dependentオプション`を記述することで解決しました。
該当のモデルに以下の記述をします。

“`ruby
#contractというモデル
class Contract < ApplicationRecord has_many :...., dependent: :restrict_with_error end ``` アソシエーション記述の後に`dependent: :restrict_with_error`と記述することで`destory`できないときのエラーを表示することができた。 以下の条件分が成り立ち解決しました!。 ```ruby

元記事を表示

[Rails]errorsメソッドでメッセージ表示させるとビューが崩れる時の対処

#はじめに
`form`で入力に誤り(例えば無入力)があるとエラーメッセージを表示させるために`errorsメソッド`を用いて記述し、動きを確認するとビューが崩れるという問題が発生しました。その時の自分の解決した方法です。

#原因
崩れたビューを確認すると`field_with_errors`という`divクラス`が付与させていていることを確認した。これが原因である。

#対処
今回はこの`field_with_errors`という`divクラス`が付与されないようにした。

`config/application.rb`に以下の記述をした。

“`ruby

module #モデル名
class Application < Rails::Application config.load_defaults 6.0 config.i18n.default_locale = :ja config.action_view.field_error_proc = Proc.new { |html_tag, instance| html_tag }

元記事を表示

[Rails]errorsメソッドでエラーメッセージが出せないときの対処

#はじめに
例えば`result.save`のように変数`result`の保存をしようとした時に、失敗するとresultにエラーメッセージが格納される。
これを利用してエラーメッセージを表示させたいがRubyのエラー画面となる。

言い換えると思い通りのエラーメッセージが出ない。

エラー時にコンソールで確認の以下のようになる

“`ruby

result.errors.any? => False
“`
保存できてないのにエラー出てないことになってる。

今回は無入力で登録しようとするとエラーを出したい。
#原因
`Model`にバリデーション記述が無かったことが原因。
テーブル作成時にはカラムに制限(無入力制限のため `null: false`とした)がそれだけではエラーメッセージがでない。

#対策

`Model`に以下のような記述をした。

“`ruby

class Result < ApplicationRecord belongs_to ... has_many ... validates :name, presence: true ..

元記事を表示

ActiveHashを解説してみた

##ActiveHash
職業選択などの変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができる。つまり、Active_Hashを用いることで、モデルファイルに直接記述した変更されないデータに対して、ActiveRecordのメソッドを用いることができる。
##導入方法
######Gemfile
“`ruby:qiita.rb
gem ‘active_hash’
“`
記述したらbundle installを実行する。
##モデル作成時に押さえておくべきこと
結論、–skip-migrationを使用すること。
理由は、データベースを作らない。すなわちマイグレーションファイルは不要となるからだ。ここでrails g modelコマンドを使用してしまうと、マイグレーションファイルも同時に作成されてしまうので注意が必要。

“`
% rails g model モデル名 –skip-migration
“`
##ActiveHash::Base
ActiveRecordと同様のメソッドが使用できる。
つまり、ActiveH

元記事を表示

【Rails】ActiveRecordのよく使うメソッド集(モデル検索、テーブル結合など)

ActiveRecordには、データベースからオブジェクトを取り出す
検索メソッドが多数用意されています。

検索メソッドはwhereやgroupといったコレクションを返したり、
ActiveRecord::Relationのインスタンスを返します。

またfindやfirstなどの1つのエンティティを検索するメソッドの場合、
そのモデルのインスタンスを返します。

# 単一のオブジェクトを取り出す
## find
主キーで検索

“`
# 主キーが1のユーザーを検索

User.find(1)

# SELECT * FROM users WHERE (users.id = 1) LIMIT 1
“`

findメソッドで複数のオブジェクトを取得

“`
# 主キーが1と10のユーザーを検索

User.find(1,10) # User.find([1,10])も可

# SELECT * FROM users WHERE (users.id IN (1,10))
“`

findメソッドでマッチするレコードが見つからない場合、
ActiveRecord::RecordNo

元記事を表示

mailcatcherが起動しない場合にやること

はじめに

現在、「現場で使えるRuby on Rails5 速習実践ガイド」いわゆる、現場Railsをざっと通して学習しています。途中でmailcatcherを使うシーンが出てくるのですが、そこで詰まったのでメモとして置いておきます。

そもそもmailcatcherって

https://mailcatcher.me/

(訳)公式サイトの訳です
mailcatcherは、ウェブインターフェースから送信されるあらゆるメッセージをキャッチしてくれるシンプルなsmtpサーバです。mailcatcherを起動し、検証したいアプリの送信先をsmtp://127.0.0.1:1025に設定することで、mailcatcherで用意したブラウザでメールを確認することができます。

言ってしまえば、シンプルなメール検証gemです。

インストールと設定

インストールはgem installを公式が推奨しています。

“`
$gem install mailcatcher
“`

インストール後以下の設定を行います。(公式のrails欄を引用)

元記事を表示

RailsでJavaScript(バニラ)が反応しない。

rails5では初期からjQueryのgemが導入されており、削除しない限りはデフォルトで利用できる状態です。
Railsを学び始めて、いつの間にか素のJavaScript(以降”バニラ”)よりもjQueryを使う方が慣れてしまっていたので、今回は改めてバニラを学習するためあえてjQueryを使わない方法を模索しました。

## 環境
Ruby 2.5.7
Rails 5.2.4

## 経緯
改めてバニラでコードを書き始めると割とハマるところが多くありました。
jQueryで書けるならそれでいいと言われればそれまでなのですが、そのままにしておくのは気持ち悪かったので少し向き合うことにしました。

### 即時関数が効かない
手始めにクリックイベントでコンソールログを確認しようとしました。
jQueryでは下記のように`$(function() {処理});`
という書き方をする必要があります。(理由は後述します。)

“`javascript:application.js
// jQuery
$(function() {
$(“セレクタ名”).on(‘クリック’, functi

元記事を表示

(ギリ)20代の地方公務員がRailsチュートリアルに取り組みます【第7章】

##前提
・Railsチュートリアルは第4版
・今回の学習は3周目(9章以降は2周目)
・著者はProgate一通りやったぐらいの初学者
##基本方針
・読んだら分かることは端折る。
・意味がわからない用語は調べてまとめる(記事最下段・用語集)。
・理解できない内容を掘り下げる。
・演習はすべて取り組む。
・コードコピペは極力しない。

第7章はログインと認証システムの開発・第2段回目、ユーザー登録機能を追加していきます。

雨が激しい昼刻(執筆時)、本日のBGMはこちらです。
[羊文学 “Blue.ep”](https://www.youtube.com/watch?v=vB5FmGDw1E4&t=1601s)
再び羊文学。最近のお気に入り。一曲目の「雨」、いいかんじです。

 
####【7.1.1 デバッグとRails環境 演習】
1. ブラウザから /about にアクセスし、デバッグ情報が表示されていることを確認してください。このページを表示するとき、どのコントローラとアクションが使われていたでしょうか? paramsの内容から確認してみましょう。
→ controller:

元記事を表示

<超初学者向け>「Talk API」を利用してチャットボットを作ってみませんか??【Ruby on Rails】

◆この記事の対象者

☆Rails on Railsを学び始めた初学者
☆ハンズオン形式でLINEBOTを作成してみたい方
☆WEBシステム開発に挫折してしまった方(※フロントエンド側の挫折)

◆はじめに

こんにちは!タイトルの通り、チャットボットを開発したので、その過程を記載しています。
この記事を投稿する経緯にもつながりますが、昔の僕はProgateを1周して、さっそくWEB開発を進めていこうとやる気に満ちていました。しかし、必然であったかのように挫折します。原因は、「フロントエンド側まで手が回らない」でした。
バックエンドのプログラミング言語を学ぶ目的で、Ruby、Railsの基礎を学び、理解度を深めるために何か作ってみようぐらいの気持ちなのに、そこに新たに「フロントエンド」という壁が生まれるのはしんどかったです。Bootstrapを利用して極力手抜きにしようと思いましたが、僕はそれにすら耐えられない、ゆとり世代なんです。
一度挫折して、心を入れ替えて再挑戦しましたが、2度目の挫折を味わいま

元記事を表示

mailcatcher はなぜthinサーバを使っているのか

# mailcatcher とは
開発環境でメール送信するとlocalhostでメールを受け取り、受け取ったメールを読むためのWEBインターフェースを提供してくれるgemです。
つまり、今までだと「開発環境でメールを送信するとログに出力されていたテキストを拾っていた」のを、「WEBメーラーで見れる」ようになるのです。

# thinとは
rackサーバと呼ばれる種類のgemで、同じ箱だとwebrick, unicon, puma, passenger, falconなどがあります。
それぞれのrackサーバには特徴があるのですが、rails5ではpumaが同梱されるようになったり、本番環境での使用実績も着実に積んできているしで、デファクトスタンダードはpumaになりつつあると思っている。

正直、thinは最近下火のように思う。では、mailcatcherはなぜpumaを使わずにthinを使っているのか。

# thinを使っている理由
thinを使っている理由はsinatraでwebsocketを動かすためなのです。
(mailcatcherは、sinatraを使ったWEBインターフ

元記事を表示

packsファイルの.jsに記載したのに反応しない

【概要】
—————————————-
1.結論

2.どのように使うか

3.なぜjsファイルに書き込まなかったのか

4.ここから学んだこと

1.結論
—————————————-
直にhtml.erbファイルで”script”を記述しscript内にjavascript言語を記載する!

2.どのように使うか
—————————————-
任意のhtml.erb内で

“`ruby:****.html.erb

“`
と記載してJavascriptを記載するだけです!
注意点としてapplication.html.erbで
<%=yiled%>を使用してヘッダーフッダーを適用している場合は反映させる順番に注意です。
HTMLが読み込まれるよりも前にJavascriptを適用させてしまうとブ

元記事を表示

Railsの本番環境でなぜかセッションが保存できない問題を解決した経緯

#概要
railsで本番環境にプッシュしたアプリがある日セッションを使った機能の全てが動作しなくなるという絶望的な問題にぶち当たった。めちゃくちゃ苦戦したし記事も全然なかったのでその解決方法を記しておく。

最終的にこの記事から設定しなおして解決しました。

【Rails】ActionController::InvalidAuthenticityToken (ELB,EC2)

#環境
・EC2にデプロイ
・サーバー環境はWebサーバーにnginx、アプリケーションサーバーにPuma
・AWSのELBにACMのSSL証明書をアタッチしてSSL化↓

クライアント→ELB→nginx→puma

#セッションが保存されない原因
####まず、セッションが保存されない原因
RailsではCSRF(クロスサイトリクエストフォージェリー)という脆弱性からサイトを守るための対策として
protect_from_forgeryというメソッドでサイトを保護している
“`application.html.erb“`のheadタグ内に“`csrf_meta_tag“`という記述をしているが
ここで認証用のauthenticate_tokenを生

元記事を表示

【Rails】チェックされた項目だけDBに格納する

teratailで質問した後、自己解決しました。
サイトがすごく重くて(?)投稿できなかったので、先にこっちに書いておきます。

###やりたかったこと###

映画にまつわるアプリを作っており、データベースに映画作品についての簡単な情報を格納する必要がありました。
ターミナルから入力するのはダルかったので、ver.1では公開せず後々ユーザー向けに改良するつもりで、アプリ内に投稿フォームを作成。newメソッドで下記の映画情報をデータベースに登録できるようにしました。

– `title`:作品タイトル
– `directed`:監督の名前
– `story`:あらすじ
– `service`:あらすじの引用元の配信サービス名
– `time`:再生時間

この中の配信サービス名を四つのチェックボックスの中から選択して、`チェックの入ったサービス名をデータベースに格納する`ということがやりたかったのですが、参考にした記事が`チェックボックスの項目とチェック状況を配列に格納する`という内容だったため、実現するためには「チェックされた値だけを取り出す」必要がありました。

チェックボックスは

元記事を表示

Rails:日本語化の仕方

#手順

application.rb内に以下を記述

“`
config.i18n.default_locale = :ja
“`

config/locales内に「ja.yml」ファイルを作成し
以下のRailsが推奨しているコードを記述

“`
ja:
activerecord:
errors:
messages:
record_invalid: ‘バリデーションに失敗しました: %{errors}’
restrict_dependent_destroy:
has_one: “%{record}が存在しているので削除できません”
has_many: “%{record}が存在しているので削除できません”
attributes:
モデル名:
カラム名: ‘表示したいカラム名’
カラム名: ‘表示したいカラム名’
date:
abbr_day_names:
– 日
– 月
– 火
– 水

元記事を表示

Rails:createアクションの仕組み

#動機
newとcreateの役割に困惑したためのメモ作成

#new
新しく作成する場合は
new.html.hamlとnewアクションがまず使用される

#create
newの中のformで作成した内容を元にDBへ登録するアクションがcreate

以下のコードが一連の流れです。

“`
def create
@task = Task.new(task_params)
if @task.save
redirect_to task_path(@task), notice: ‘Task is create’
else
render :new
end
“`

##データの取得

“`
@task = Task.new(task_params)

private
def task_params
params.require(:task).permit(:title, :content)
end
“`

newで取得した内容を@taskに引数として渡している
引数にはprivateメソッドで取得した値をいれる

re

元記事を表示

【Rails】LINEBotでPush送信

# 概要
RailsからLineBotのPush送信します
以下のように、任意のタイミングで送信するやつです
![Screenshot_20200912-131255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199110/6b0c36c0-c938-83c3-f814-769a2267786f.png)

# LINEBotの作成
記事がたくさんあるので、そちらを参照してください
例えば、以下のような記事があります

[LINE BOTの作り方を世界一わかりやすく解説(1)【アカウント準備編】](https://qiita.com/yoshizaki_kkgk/items/bd4277d3943200beab26 “Qiita”)

# RailsからLINEBotでPush送信
1. Gemfileでライブラリ`line-bot-api`をインストールしておいてください
2. `ENV[“LINE_CHANNEL_SECRET”]`、`ENV[“LINE_CHANNEL_TOKEN”]`は、

元記事を表示

OTHERカテゴリの最新記事