- 1. Hamlとは?
- 2. Rails エンコードして、文字を含んだ検索URLを作成したい【URI.encode_www_form_component】
- 3. 【Ruby on Rails】ストロングパラメーターはなぜ必要か?paramsの脆弱性
- 4. [Rails] タグ機能
- 5. [Rails] Ajaxで作るクリップ機能(いいね機能)
- 6. 【備忘録】【環境構築】Docker + Ruby on Rails + ReactでSPA化
- 7. Rails部分テンプレート(パーシャル)まとめ
- 8. メソッドによるコード省略!
- 9. Railsでフォロー機能を作成する方法【改】
- 10. Ruby on Rails のwhereメソッドの条件を文字列だけで構成するとはSQLインジェクションの危険がある。
- 11. 【Rails6】cocoonによる動的フォーム作成時に注意すべき点。「”accepts_nested_attributes_for”」、「”can’t be blank”」
- 12. RailsアプリでTwitter認証実装中にルーティングエラーになった時の解決法
- 13. Rails6+mysql5.7+Docker+AWSで作成したポートフォリオの概要
- 14. 【CircleCI】『Unable to find gem rubocop-discourse; is the gem installed? Gem::MissingSpecError』が出てRuboCopが失敗する際の解決方法
- 15. 【Rails】map関数で行うリファクタリング
- 16. 【図解】個人サービスを例に、Web APIの概要とRailsでの使い方を一番やさしく説明する
- 17. Failure/Error: config.include FactoryBot::Syntax::Methodsが出た時の対処方法
- 18. Railsで出てくるparams[:id]ってなんだ?paramsについて深く理解してみる
- 19. 【備忘録】WebAPIサーバを作るとはどういうことか
- 20. Prefixについて!
Hamlとは?
「HTML avstraction markup langage」が正式名称です。
マークアップ言語(HTML/XML)を生成する為のマークアップ言語です。
より短いコードで綺麗に簡潔にコードを書くことができます。
## Hamlの書き方
### 基本記法
`%タグ名`でタグと閉じタグが生成されます。
正しくインデントをすることが必要です。“`haml:index.html.haml
%ul
%li
Hello World!
%li
hoge hoge!
“`htmlに変換すると↓
“`html:index.html
- Hello World!
- hoge hoge!
“`
### 属性をつける
属性をつける場合は、
`%タグ名{属性:”値”}`or`%タグ名{:属性=>”値”}`“`haml:index.html.haml
%ul
%li
%a{href: “https://muscle-meal-recipes.com”}
Hello World!
%li
Rails エンコードして、文字を含んだ検索URLを作成したい【URI.encode_www_form_component】
# 概要
Twitterから取得した内容をDBに保存した。
保存した複数のデータに関連したGoogle検索ページに遷移するボタンを作成したい。# 条件
“`ruby:
brand = “Supreme / Yohji Yamamoto®”
price = “¥6,600-”
item = “New Era Beanie Black”
“`この3つを含む検索画面に遷移させたい。
### 目標の画面はこれ↓
![9eb080a3d68efa1a5d4a0955525d80d7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2133440/5ad7fb72-bced-95b0-91c8-a66cbfa68133.png)## 行き詰まったポイント
### googleの検索urlに文字列を組み込めない
urlはこのような形になる` “https://www.google.co.jp/search?q=”
`
`q=`の後に検索したい文字を組み込むここにそのまま入れ込むと..
【Ruby on Rails】ストロングパラメーターはなぜ必要か?paramsの脆弱性
##はじめに
どうも、27歳未経験からエンジニア転職を目指しているもきおです。Railsでコントローラを記載する際に最後にストロングパラメータ書いてねって記載されてたりしますが、そもそも **ストロングパラメータって何ぞや?**って思いながらも当時はとりあえず動けばいっかみたいな感じであまり理解しないまま進めてしまってました。
ストロングパラメータの記載はこんな感じ
“`ruby:user_controller.rb
private
def user_params
params.require(:user).permit(:name,:email,:password)
end
“`今回はなんでこれが必要なのって話とparamsは使いようによってセキュリティの脆弱性があるよってお話をしていきたいと思います。
##ストロングパラメータを使わないとどうなる?
ストロングパラメータを使用しないとどのようなセキュリティ上の問題が起こるのでしょうか?
例えば以下の記載でuser_controllerのcreateを作成したと
[Rails] タグ機能
ポートフォリオにタグ機能を実装した時のメモです。
# 完成イメージ
投稿画面でタグが投稿でき投稿したタグで絞り込み検索ができる機能です。
![スクリーンショット 2021-10-11 8.06.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974719/9071dbbc-9383-a360-6c57-573e91b47110.png)# 実装
今回実装する部分の関係性は以下のような関係性です。
![スクリーンショット 2021-10-11 6.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974719/41508201-71f5-9255-c0a8-d32d49ecfe81.png)
イベントモデル(CRUD機能)は既に実装済みとします。### モデル作成
モデルを作っていきます。“`terminal:ターミナル
$ rails g model tagmap item:referenc
[Rails] Ajaxで作るクリップ機能(いいね機能)
ポートフォリにAjaxでいいね機能を実装した時のメモです。
### Ajaxとは?
JavaScriptを使ってサーバーにリクエストを投げて、レスポンスに基づきHTMLに変更を加える技術のことらしい。
分かりやすくいうとページのリロードなしで表示が切り替わるってこと。
身近なのはやっぱりTwitterのいいねですかね。多対多のクリップ機能は既に実装済みでとします。
ちなみに今回の場合は、以下のようにUserモデルとEventモデルの中間テーブルとしてClipモデルがあることとしてます。![スクリーンショット 2021-10-08 16.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974719/528ca12e-9481-f2dd-d6d2-257c356ee438.png)
# 完成イメージ
クリップしたときにリロードなしでクリップできていてクリップしたイベントとしてクリップイベント一覧に反映されている。
![ezgif.com-gif-maker (5).gif](https
【備忘録】【環境構築】Docker + Ruby on Rails + ReactでSPA化
RailsとReactを使ってSPA化したWebアプリをDocker環境で作ろうとして、結構苦労したため、自分用のメモとして残します。
# 各種ファイルの用意
プロジェクト用のフォルダを用意して、Rails側のapiフォルダとReact側のfrontフォルダに分ける。
プロジェクト用フォルダの直下に、docker-compose.ymlを置く。“`
$ mkdir -p ~/project/rails-react-app
$ cd ~/project/rails-react-app
$ mkdir ~/project/rails-react-app/api
$ touch ~/project/rails-react-app/api/Dockerfile
$ touch ~/project/rails-react-app/api/entrypoint.sh
$ touch ~/project/rails-react-app/api/Gemfile
$ touch ~/project/rails-react-app/api/Gemfile.lock
$ mkdir ~/proje
Rails部分テンプレート(パーシャル)まとめ
## 使い方1
“`erb:before
xxx.html.erb<%= @user.name %>
<%= @user.email %>
<%= @user.age %>
“`“`erb:after
xxx.html.erb
<%= render partial: 'hoge', locals: {user: @user} %>_hoge.html.erb
<%= user.name %>
<%= user.email %>
<%= user.age %>
“`
※ 書き方:`<%= render partial: 'ファイル名', locals: { '部分テンプレート内で使う変数': '変数に入れる値' } %>`※ ファイル名は、render記載のファイルと同じディレクトリにある`_hoge`なら`hoge`。
※ localsオプションを使った場合はpartialは省略できない。
※ partialを省略したいならlocalsオプションも省略しないといけない
(例:`<%= render 'hoge', user: @user %>`)
※
メソッドによるコード省略!
コントローラーに同じ記述があった際、まとめる為の記述を解説します!
下記の例を参考にして、before_actionを使用して、メソッドとしてまとめます!
#①.before_actionメソッドを使用して、同じコードをまとめる!
例として、下記の記述では,
@eat = Eat.find(params[:id])が、繰り返し使用されています!
“`php
class eatsController < ApplicationController def index @eats = Eat.all end def edit @eat = Eat.find(params[:id]) end def show @eat = Eat.find(params[:id]) end private def eat_params params.require(:eat).permit(:name, :image, :text) end end ``` この記述をまとめるために、before_actionを
Railsでフォロー機能を作成する方法【改】
#前提
☆必要なテーブル
・usersテーブル
・relationshipsテーブル(中間テーブルです)
☆ポイント
・アソシエーションが普通の「多対多」とは違う事(ちゃんと解説します!!)
・Userモデル、usersテーブルは作っている前提で説明します!!
#流れ
⓵relationshipsモデルを作る⓶relationshipsのマイグレーションファイルを編集&実行
⓷userモデルとrelationshipsモデルにアソシエーションを書く
⓸userモデルにフォロー機能のメソッドを書く
⓹relationshipsコントローラを作成&編集
⓺フォローボタン(form_for)をviewに設置
⓻ルーティングを書く!終了!
#⓵relationshipsモデルを作る
今回はuserとtweetsの関係性とは違い、userテーブル同士で「多対多」の関係を作ります。何故ならフォロワーもまたuserだからです。イメージとしてはuserテーブル同士をrelationshipsという中間テーブルでアソシエーションを組むイメージです!
まずは、r
Ruby on Rails のwhereメソッドの条件を文字列だけで構成するとはSQLインジェクションの危険がある。
Railsのwhereメソッドの条件を文字列だけで構成することは危険なようです。
Webサービス作成する中で「あるカラムに値が設定されているレコードを取得する」為、下記のようにコーディングしていました。
値が設定されていないだったらRailsのwhereメソッドに「selling_day:nil」みたいな感じで取得してあげれば良いかと思いますが
“`ruby:stocks_controller.rb
@stock = Goal.where(‘selling_day like ?’,’%’)
“`
ただ、文字列だけで条件を指定するとSQLインジェクションのリスクがあるようです。
具体的には“`ruby:stocks_controller.rb
@stock = Goal.where(“selling_day = ‘#{params[:day]}'”)
“`
みたいに書くとparams[:day]に悪意のある文字列を設定され、認証をすり抜けるリスクがあります。
下記のように条件をハッシュ値で指定するか、配列で指定するようにするとリスク回避できるようです。“`ruby
【Rails6】cocoonによる動的フォーム作成時に注意すべき点。「”accepts_nested_attributes_for”」、「”can’t be blank”」
cocoonを用いて、動的に変化するフォームを作成した際にハマったことを記します。
cocoonの導入は以下の記事を参考にしました。
・[【Rails】cocoonを用いて親子孫関係のテーブルに複数のデータを同時保存する方法 – Qiita](https://qiita.com/hitochan/items/5a45a95e644492d66160)
・[【Rails6】cocoonを使った動的フォーム入力画面の作り方 – Qiita](https://qiita.com/shooo777/items/4691a08357ee15233d4a)#問題概要
以下のような3つのモデルを作成し、関連づけたと仮定します。|関係 |モデル名 |
|—|—|
|親 |Parent |
|子 |Child |
|孫 |Grandchild |上記記事を参考にしながらフォームを作成し、できたフォームよりデータを送信したら、以下のようなバリデーションに引っかかりました。
:::note alert
Child Grandchild child can’t be bl
RailsアプリでTwitter認証実装中にルーティングエラーになった時の解決法
色々な記事を見ながらRailsアプリにomniauth-twitterを使用してTwitter認証を実装していたのですが、どういうわけかかなりハマりました。
最終的にうまく行ったのでその方法を備忘録がてら記載しておきます。## 前提
### 諸々のバージョン
使用しているPC: MacBook Air (M1, 2020)
Railsバージョン: 6.1.4.1
Rubyバージョン: ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [arm64-darwin20]
omniauthバージョン: 2.0.4
deviseは使用していません。### 最終的に参考にした記事
https://qiita.com/d0ne1s/items/7a96b835280f55bb5234https://takagi.blog/csrf-vulnerability-in-omniauth-twitter-request-phase/
##ハマったこと
omniauth-twitterを使用して認証を実装後、/auth/twitterにアクセスす
Rails6+mysql5.7+Docker+AWSで作成したポートフォリオの概要
#はじめに
この記事では私が作成したwebアプリのポートフォリオの解説をします。
作成したポートフォリオは下記になります。↓
[作成したポートフォリオ](https://forza-kanazawa.com/)#自己紹介
年齢:27歳
職業:地元企業のエンジニアリング部に所属
住居:地方
趣味:映画、音楽、英語(TOEIC:770)、バレーボール映画はSFが好きで特にスターウォーズが好きです(アイコンはマンダロリアン)。英語の勉強も兼ねて英語で鑑賞するようにしています。
大学時代は軽音部に所属しており音楽は今でもよく聴きます。
中高、社会人とバレーボールを続けており、春高やVリーグは今でもチェックしています(制作背景につながります)。#制作背景
私は中学生〜高校生、社会人とバレーボールを続けています。
社
【CircleCI】『Unable to find gem rubocop-discourse; is the gem installed? Gem::MissingSpecError』が出てRuboCopが失敗する際の解決方法
#はじめに
本記事では、CI(RuboCop、RSpec)のみ動作させています。
設定ファイルの細かい説明については、分かりやすい記事がたくさんあるのでそちらにお任せします。
参考にさせていただいた記事↓https://qiita.com/prkrsign890/items/b2161784065f21cd1645
最後に私の“.circleci/config.yml“の設定ファイルを参考までに記載します。
#CircleCI上でRuboCopがエラーになる
CircleCIでRuboCopを動かすと次のようなエラーが発生しました。“`
Unable to find gem rubocop-discourse; is the gem installed? Gem::MissingSpecError
…(以下ディレクトリ/ファイル名の羅列)
“`“rubocop-discourse“が見つからないと言われています。
ローカルでは“rubocop-discourse“がなくても問題なく動いているのになぜ..#解決方法1
言われた通りに、Gemfi
【Rails】map関数で行うリファクタリング
## 状況
UserテーブルとPostテーブルが1対1のアソシエーションの場合。
アクティブなUserの投稿した記事のidを配列形式で取得する“`ruby
post_ids = User.where(status:”active”).post.pluck(:id)
“`
こんな感じで1行で取得したいが、User.where(status:”active”)は配列なのでpostを一意に識別できずエラーになる## 冗長なコード
“`ruby
users = User.where(status:”active”)post_ids = []
users.each do |user|
post_ids.push(user.post)
end
“`
あまりスタイリッシュじゃない、、。## map関数でリファクタリング
“`ruby
post_ids = User.where(status:”active”).map { |u| u.post.id }
“`
ワンラインで書けていい感じ## Another worksでは一緒に働ける仲間を探しています
http
【図解】個人サービスを例に、Web APIの概要とRailsでの使い方を一番やさしく説明する
# 記事の目的
– 「そもそもWebAPIとは?」って人がWebAPIの概要を理解できる
– Rails初学者がWebAPIの使い方を理解できる# この記事を理解できる人
– Webにおける`リクエスト`と`レスポンス`のイメージを、なんとなくでいいので理解している人
– Progateの`Ruby`と`Rails`を完走できるレベルの人(WebAPIの概要だけ見るなら不問)# 目次
[例に出すサービスの内容](#例に出すサービスの内容)
[APIとは](#apiとは)
[APIが分かりにくい2つの理由](#apiが分かりにくい2つの理由)
[Railsでの一番簡単な使い方 リクエスト編](#railsでの一番簡単な使い方-リクエスト編)
[Railsでの一番簡単な使い方 レスポンス編](#railsでの一番簡単な使い方-レスポンス編)
[まとめ](#まとめ)
[補足(JSONとは?)](#補足-jsonとは)
[開発環境](#開発環境)# 例に出すサービスの内容
### サービス概要
Failure/Error: config.include FactoryBot::Syntax::Methodsが出た時の対処方法今回は記述場所を間違えるという非常に初歩的なミスが原因でしたが、他の方の記事を見ても、どこかしらで記述ミスしていることが多いという印象を受けました。
同じようなエラーで詰まっている方の参考になれば幸いです。
# やりたいこと
rspecによるテストの実行。
`Failure/Error: config.include FactoryBot::Syntax::Methods`と`NameError:uninitialized constant FactoryBot`の解決。# やったこと
ターミナルで`bundle exec rspec`を実行すると、下記のエラーが発生した。# エラー内容
“`ruby:ターミナル
An error occurred while loading rails_helper.
Failure/Error: config.include FactoryBot::Syntax::MethodsNameError:
uninitialized constant FactoryBot
# ./spec/spec_helper.rb:19:
Railsで出てくるparams[:id]ってなんだ?paramsについて深く理解してみる
##はじめに
どうも、27歳未経験からエンジニア転職を目指しているもきおです。Ruby on Railsを学習しているとよくコントローラーにおいてparamsってやつが出てきますよね?
例としてはこんな感じ“`ruby:users_controller.rb
def show
@user = User.find(params[:id])
end
“`でもshowの他にeditとかcreateとかでも出てきてしかも記載の仕方がちょくちょく変わっている。
自分自身もとりあえず見様見真似でnewの時はこの記載、showはこの記載みたいな感じで記載してまあエラー起きず動いたら満足って感じでコードを書いてました。今回はparamsについて理解を深めたのでただコピペでなくちゃんと理解をした上でparamsを使用できるようこの記事に書き記しておきます。
※createに関してのparamsの記載は後日別記事にて記載します。
##paramsってなんぞ?
paramsとは**送られてきた値を受け取るためのメソッド**のことです
【備忘録】WebAPIサーバを作るとはどういうことか
RailsとReactでSPA化を実装したいのですが、そもそもWebAPIサーバの意味が理解できていなかったため、記事に残しました。
SPAでは、最初のページにあたるHTMLのみをサーバから取得し、その後の画面の書き換え等をすべてクライアント側(ブラウザ内)のJavaScriptで実施する。
そのため、SPAのアプリケーションでは、サーバ側(Rails側)のアプリケーションの役割はいわゆるWebAPIとしてブラウザ側のJavaScriptとAjax通信を行うのみ、というケースも多い。# API専用Railsアプリケーションの生成コマンド
“`
$ rails new my_api –api
“`▼詳細はRailsガイドを参照
https://railsguides.jp/api_app.html
▼参考記事
大変わかりやすかったです!
Prefixについて!
#①.結論!
Prefixとは、ルーティングのURI Patternに名前をつけて変数化したものです!
これにより、URI Patternの代わりにPrefixを用いてパスを表現できます!
簡単に言うと、遷移する指定先をパスで視覚化した事です!
細かく説明していきます!
#②.解説!
例として、ターミナルでrails routesコマンドを実行して有効なルーティングを探すと、以下のような表示になります!
“`php
Prefix Verb URI Pattern Controller#Action
eats GET /eats(.:format) eats#index
他省略“`
一番左上の列を確認します!
一番上にはPrefixという文字があり、その配下にはPrefix名が出力されていることが確認できます!
つまり、下記のようにURI Pattern(パス)が変数化したと言う事です!
“`php
Prefix Verb URI Pattern -> e