Ruby/Rails

【Ruby】puts, print, p

メソッド 出力後の改行 配列の表示 戻り値 呼び出すメソッド puts あり 要素ごとに改行 nil to_s print なし 改行しない nil to_s p あり 改行しない 引数のオブジェクト inspect

webpackerで扱うエントリーポイント

webpackerで扱うエントリーポイント app/javascript配下のファイルをビルドし、public/packs/jsにビルド結果が出力される。 (sprocketsではapp/assets/javascripts) たとえばapplication.jsをビルドした成果物はapplication-xxx.js エントリーポイントの読…

credentials ~秘匿情報の管理~

credentials Railsでアプリケーションを作成すると、credentials.yml.encとmaster.keyが作成される。 config/credentials.yml.enc 暗号化された設定ファイル。秘匿情報を記述する。 asl;kdjf;woiejfw@iwqjf[qw@jo...... 中身 # aws: # access_key_id: 123 # …

variantsによるテンプレートの切り替え

接続してきた端末によってテンプレートを切り替える UserAgentなどを参照してrequest.variantの値を設定する request.variantの値によってテンプレートが選択される def show request.vatiant = :mobile if request.user_agent =~ /iPhone/ ... end このとき…

Railsの思想

CoC 〜設定より規約〜 Employeeモデルがあるとすると、Railsでの規約は以下の通りになる。 データベースのテーブル名はモデル名の複数形(employeesテーブル) /employeesは社員の一覧を、/employees/1はID:1の社員を表す 規約に従うことで設定ファイルを書…

webpacker

webpack CSSやJavaScript、画像などWebコンテンツを構成するあらゆるファイル(アセット)を「モジュール」という単位で取り扱い、依存関係を解析して「バンドル」という1つのファイルに最適な形で変換するためのツール。 Webpackコマンドを使ってビルドする…

クロスサイトスクリプティング(XSS)

ユーザー環境で不正なスクリプトを実行させる。 標的サイトに悪意のあるスクリプトが埋め込まれるようなリンクを踏ませる or 標的サイトにフォームなどから直接悪意のあるスクリプトを埋め込む 標的サイトにユーザーがアクセスしたとき、特定のタイミングで…

SQLインジェクション

パラメータを操作して不正なデータベースクエリを発行させる。 Railsでの対策 railsではパラメータの文字列が自動でエスケープされる。 ただしwhereなど(条件フラグメント)については手動でエスケープする必要がある。 Model.where("login = ? AND passwor…

クロスサイトリクエストフォージェリ(CSRF)

攻撃対象のwebアプリケーションに意図しないリクエストを送信させる。 攻撃手法 攻撃用のwebページや掲示板やメールに、標的のユーザーがログイン中の標的アプリに無意識にリクエストを送らせるコードやリンクを仕込む。 ブラウザはリクエストのたびにcookie…

CookieStoreセッションに対する攻撃

CookieStoreによるセッション管理 RailsはデフォルトのセッションストレージとしてCookieStoreを用いる。 CookieStoreはセッション情報をsecret_key_baseで暗号化し、クライアント側のcookieに保存する。 再生攻撃 最初にブラウザに保存されていたcookieをコ…

セッションハイジャック

ユーザーのセッションIDが盗まれると、攻撃者がそのユーザーをかたってアプリケーションを利用できてしまう。 Railsでの対策 SSL接続を強制する。 Rails.application.configure do config.force_ssl = true end

【Rails+Vue】jwtによるトークン認証

認証におけるjwtのメリット CORSなどの制約がない 異なるドメイン間の通信を拒否する制約にかからない スケーラブルである cookie認証の場合はセッションを保持する別のサーバーやDBが必要になる。jwt認証の場合はアプリケーションサーバーのみで認証ができ…

【Rails+Vue】Rails⇔Vue間のデータの送受信

Vue→Rails 以下のようなストロングパラメータが設定されているとき、params[:user][:name]などといった二重ハッシュである必要がある。 def user_params params.require(:user).permit(:name, :email) end このとき、axiosの引数は以下のような構造にすればO…

【Rails+Vue】プロジェクト作成

プロジェクト作成 初めからプロジェクトを作る場合 % rails new todo_sample --webpack=vue Railsアプリに途中からVueを導入する場合 % bin/rails webpacker:install % bin/rails webpacker:install:vue 開発環境サーバーの設定 foremanでrails serverとwebp…

select, map, collect

select コレクションのサブセット(部分集合)を取得する。select!では元のコレクションが改変される。 i = [1,2,3,4,5] i.select {|x| x % 2 == 0} # => [2, 4] map コレクションの各要素に操作を実行し、更新されたコレクションを取得する。map!では元のコ…

find, find_by, where 〜ActiveRecord::Relationとクエリインターフェース〜

find idを引数にとり、マッチした一件を返す 例外を起こす find_by キーと値を引数にとり、マッチした最初のレコードを返す nilを返す(find_by!は例外を起こす) where キーと値を引数にとり、マッチしたレコードのコレクション(ActiveRecord::Relationの…

Rubyの変数

インスタンス変数 クラス定義内で定義しない(するとクラスインスタンス変数になる) インスタンスに関連付けられる変数(インスタンスごとに独立した変数)なのでクラスメソッドからはアクセスできない あるインスタンスで属性値を変更しても、他のインスタ…

includeとextend

include インスタンスメソッドとしてアクセスできる。 クラスのインスタンスメソッドをモジュールで拡張する場合。 extend クラスメソッドとしてアクセスできる。 クラスメソッドなどの拡張だけが目的である場合 module Greetings def hello puts 'hello' en…

【Ruby】splat演算子

メソッドに渡される引数の数を事前に決めておきたくない場合に使う。可変長引数を取れるようにする。 def do_sth(*input) input.each {|x| puts x } end do_sth(3,4,5) # => 3 # => 4 # => 5 double splat演算子:キーバリューを引数にとる def do_sth(**inp…

【Ruby】yield

yield メソッドに渡されたブロックにアクセスする。 def puts_stuff puts 'first line' yield if block_given? puts 'third line' yield if block_given? end puts_stuff { puts 'its me' } # => first line # => its me # => third line # => its me

Rack

Rackとは アプリケーションサーバとRubyフレームワークをつなぐインターフェースを提供しているライブラリ。 Rack登場以前はアプリケーションサーバとフレームワークが密結合しており、組み合わせによってはデプロイ方法が複雑になってしまっていた。Rackの…

コールバック

オブジェクトのライフサイクルの中でメソッドを実行するフック。

count, length, size

count レコードの件数をカウントするSQLクエリを実行する。DBとメモリでレコード数が違う可能性がある場合に有用。 length メモリ上のコレクションに含まれるアイテムの件数を返す。データベーストランザクションを実行しない分、countより高速。 size lengt…

ActiveRecordマイグレーション

マイグレーションの概要 一つ一つのマイグレーションはデータベースの新しいバージョンとみなすことができる。スキーマは最初空の状態から始まり、マイグレーションによる変更が加わるたびにテーブル、カラム、エントリが追加される。マイグレーションの実行…

Service Object

ServiceObjectを導入するケース アクションが複雑になる場合 (決算期の終わりに帳簿をクローズする、など) アクションが複数のモデルにわたって動作する場合 (eコマースの購入でOrder, CreditCard, Customer を使用する、など) アクションから外部サービスと…

initializeメソッド

Rubyのオブジェクトをnewで生成する時、そのオブジェクトのinitializeメソッドが実行される。 class User # 初期値の設定などに使う def initialize(name, email, address) # 初期値 @name = name @email = email @address = address end end

content_tagによるHTMLタグの生成

HTMLとERBが混在する場合などに使用するとすっきり表現できる <%= content_tag (:i, nil, class: 'fa fa-youtube-play') %> <%= content_tag (:div, "Hello world!", class: "strong") %>

simple_formによるフォーム作成の簡略化

gem 'simple_form'で最低限の記述でフォームを作成できる。 gem 'simple_form' % bundle install % rails generate simple_form:install <%= simple_form_for @user do |f| %> <%= f.input :username, error: '半角英数字で' %> <%= f.input :email, placeho…

認可

ユーザーのロールによって使えるアクションを制限する。 pundit pundit: 各アクションがどのユーザーに認可されているかをポリシーファイルで管理する (cancancan: ユーザーごとにどのような権限を持っているかを管理する) gem "pundit" % bundle install % …

FormObjectを用いた検索機能

FormObject form_withのmodelオプションにActiveRecord以外のオブジェクトを渡す時(複数のモデルを扱うときなど)のデザインパターン。ActiveModelをインクルードすることで実現。 DBを使わないフォームでも、ActiveRecordを利用した場合と同じお作法を利用…