はじめに
この記事の筆者はプログラミングを学習し始めたばかりの初心者です。間違いがあれば指摘していただけると幸いです。
概要
この記事はRuby on Rails6 実践ガイドを読んで学んだことを自分用のメモとして記録したものです。抜粋してピックアップするので読みづらいと思われます。すいません。
この本には、続編の機能拡張編もあり、記事を書いている段階で二冊とも学習を終えています。復習もかねて記事を書いていくつもりです。
18のチャプターに分かれているので、見出しごとに区切っていきます。
前の記事
Ruby on Rails6 実践ガイド cp4~cp6 【メモ】
Ruby on Rails6 実践ガイド cp7~cp9 【メモ】
Chapter 10 レコードの表示、新規作成、更新、削除
try
このメソッドはレシーバーがnilであればnilを返し、nilでなければ第一引数に指定した名前のメソッドを実行します。第二引数以降はメソッドの引数になります。
user.try(:name=, "foo")
上の例だとuserがnilでないなら、userをレシーバーとしてname=が実行されます。
配列でURLを指定する
def show
staff_member = StaffMember.new(params[:id])
redirect_to [ :edit, :admin, staff_member ]
end
上記のように配列でURLを指定することができます。配列の要素からルーティング名が推定され、URLパスが生成されます。上の例だとRailsがルーティング名は edit_admin_staff_member であると推定し、/admin/staff_member/:id/edit というURLが導き出されます。
after(css)
label.require:after {
content: "*";
padding-left: 6px;
color: $red;
}
:after をcssセレクタの後につけると、要素の後ろにcontentに指定した要素が追加されます。上の例だと require クラスのlebel要素の後ろにアスタリスクがつくようになります。
Chapter 11 Strong Parameters
マスアサインメント脆弱性
プログラミングの初歩的な知識があれば、自由に書き換えられるべきではない属性を書き換えることができてしまいます。この脆弱性をマスアサインメント脆弱性といいます。Strong Parametersはこの脆弱性に対してRails4.0で導入された対抗策です。
Strong Parameters
params.require(:login_form).permit(:email, :password)
paramsはparamsオブジェクトを返すメソッドです。requireメソッドを呼び出すと、paramsオブジェクトが:login_formというキーをもっているかどうかを調べます。もし持っていなければ例外ActionController::ParameterMissingが発生します。
requireメソッドの戻り値にpermitメソッドを呼び出すと、引数に指定されていないパラメーターが除去されます。
FactroyBotの設定
#省略
RSpec.configure do |config|
#省略
config.include FactroyBot::Syntax::Methods
end
上記の設定がない時、FactroyBotを呼び出そうとすると、
user = FactroyBot.create(name: "foo")
のように呼び出す必要がありますが、
設定を追加することにより、下のようにFactroyBotを省略して書くことができます。
user = create(name: "foo")
Chapter 12 アクセス制御
skip_before_action
クラスメソッドskip_before_actionは、引数に指定したメソッドがアクションの前に実行されないようにします。
skip_before_action :authorize
親クラスで指定されたbefore_actionをスキップしたい時などに使えます。
共有エグザンプル
shared_examples
shared_examples "a protected admin controller" do |controller|
let(:args) do
{
host: Rails.application.config.baukis2[:admin][:host],
controller: controller
}
end
describe "#index" do
example "ログインフォームにリダイレクト" do
get url_for(args.merge(action: :index))
expect(response).to redirect_to admin_login_url
end
end
end
shared_examples メソッドを用いると、複数のspecファイルで同じexampleを使いまわすことができます。上記の例ではどのコントローラのindexアクションかが明示されていないので、複数のファイルで共用できます。
使用例
describe "管理者による職員管理", "ログイン前" do
include_examples "a protected admin controller", "admin/staff_member"
end
include_examplesは第一引数にshared_examplesの名前を指定します。第二引数以降はブロック引数として取り込まれます。上の例では、controllerを指定しています。
describeの第二引数
上の例ではdescribeに2つ目の引数が指定されています。これはcontext(文脈)を表します。
下のように書き換えられます。
describe "管理者による職員管理" do
context "ログイン前" do
include_examples "a protected admin controller", "admin/staff_member"
end
end
travel_to
ActiveSupport::Testing::TimeHelpersのtravel_toメソッドは現在時刻を指定した時点に移動させます。
RSpecにActiveSupport::Testing::TimeHelpersを組み込むにはrails_helperでincludeする必要があります。
#省略
RSpec.configure do |config|
#省略
config.include ActiveSupport::Testing::TimeHelpers
end
travel_to 60.minutes.from_now
上の例では、現在時刻を60分進めています。
travel_back 60.minutes.ago
travel_backを用いて現在時刻を60分戻すこともできます。
続き
続きの記事のURLも順次追加していきます。
Ruby on Rails6 実践ガイド cp13~cp15 【メモ】
Ruby on Rails6 実践ガイド cp16~cp18 【メモ】
Ruby on Rails6 実践ガイド[機能拡張編] cp3~cp6 【メモ】
Ruby on Rails6 実践ガイド[機能拡張編] cp7~cp9 【メモ】
Ruby on Rails6 実践ガイド [機能拡張編] cp10~cp12 【メモ】
引用元
※マークダウンの引用を用いている部分は以下の書籍から引用しています。
Ruby on Rails6 実践ガイド