Closed70

💟 Rails開発者が採甚面接で聞かれる想定Q&A 53問翻蚳を自分なりに深堀りしおみる

Haruya IzumiHaruya Izumi

💟 Q1: ブログアプリで蚘事のリストを取埗するずきのリク゚スト/レスポンスサむクルをひずずおり説明しおください

  1. ナヌザヌがボタンをクリックする
  2. /articlesずいうURLぞGETリク゚ストがWebサヌバヌからRailsに枡される
  3. Railsでは、routes.rbに割り圓おられおいるURL/コントロヌラに基づいお、リク゚ストに玐づくコントロヌラアクションを実行したすここではindexアクション
  4. Articleコントロヌラのindexアクションでは、Article.allでArticleモデル経由でデヌタベヌスからデヌタを読み蟌み、むンスタンス倉数に代入されたす
  5. ビュヌでむンスタンス倉数を受け取り、繰り返す凊理などで倀を展開し、リク゚ストを送信しおナヌザヌにレンダリングしたす
Haruya IzumiHaruya Izumi

💟 Q2:「Rubyではほがあらゆるものがオブゞェクトである」に぀いお説明しおください

Haruya IzumiHaruya Izumi

クラスを䜿甚しない堎合の比べお、デヌタずメ゜ッドが管理しやすくなる。デヌタをクラスを䞀緒に持ち運べるのもクラスのメリット。
匕甚チェリヌ本

Haruya IzumiHaruya Izumi

💟 Q3: Rubyの型は静的ですか動的ですか

Rubyは動的型付け蚀語 倉数などのデヌタ型の宣蚀がいらないプログラミング蚀語

動的型付けのメリット

  • 蚘述量が枛る
  • 比范的簡単にプログラムが曞ける

参考文献

https://qiita.com/toryuneko/items/c023031b61886cae2a99

https://qiita.com/wann/items/16920b070dc0483f152a

Haruya IzumiHaruya Izumi

💟 Q4: Rubyのゲッタヌずセッタヌに぀いお説明しおください

ゲッタヌずは、ゲッタヌを甚いおむンスタンス倉数にアクセスできるようになる
セッタヌずは、セッタヌを甚いおむンスタンス倉数に倀を蚭定できる

# ほが䜿甚しないけど、手動で定矩するず以䞋のようになる
class Car
  # ゲッタヌの定矩
  def color
    @color
  end
  # セッタヌの定矩
  def color=(color)
    @color = color
  end
end
c = Car.new
c.color = 'red'
puts c.color # => red
# attr_accessorを䜿甚した堎合
class Car
  attr_accessor :color
end
c = Car.new
c.color = 'blue'
puts c.color #=> blue
Haruya IzumiHaruya Izumi

💟 Q5: Rubyであるメ゜ッドを呌び出したずきの動䜜を説明しおください

オブゞェクトに察しおメ゜ッドを呌び出したす

メ゜ッドはクラス内で定矩され、そのクラスから䜜成されるオブゞェクト(レシヌバヌず呌ばれたす)に察しお行わせたい凊理を蚘述するものです。その為、メ゜ッドを呌び出す時には察象ずなるオブゞェクトず実行させるメ゜ッド名を指定しお呌び出したす。
匕甚 : Let'sプログラミング

Haruya IzumiHaruya Izumi

💟 Q6: あるRailsアプリ内のルヌティングをすべお衚瀺しおください

$ rails routes
Haruya IzumiHaruya Izumi

💟 Q7: Gemfileに぀いお説明しおください

Gemfileは、アプリケヌションで利甚される䟝存関係を指定したす。

ルヌトディレクトリに眮かれる

Haruya IzumiHaruya Izumi

💟 Q8: Gemfile.lockに぀いお説明しおください

Gemfile.lockには、むンストヌルされたgemの正確なバヌゞョンが蚘録されおいたす

Haruya IzumiHaruya Izumi

💟 Q9: Railsでどんなデザむンパタヌンを䜿ったこずがありたすか

  • Service Objectパタヌン

肥倧化したActiveRecordモデルを分割し、コントロヌラをスリムか぀読みやすくするうえで非垞に有甚な、Ruby on Rails開発における䞀皮の開発パタヌン
✅パrailsにある

  • Validatorパタヌン

ActiveRecord::Base継承クラスのレコヌドを怜蚌する責務

  • Policy Objectパタヌン

ビゞネスルヌルをカプセル化する責務pundit

  • Decoratorパタヌン

モデルに察するビュヌのロゞックをカプセル化する責務

䜿ったこずはないけど、重芁

  • Query Objectパタヌン

ActiveRecord::Relationに察しお結合や絞り蟌み、゜ヌトなどの操䜜を行い、Relationを返す責務

  • Form Objectパタヌン

ナヌザからの入力を敎圢・怜蚌しお氞続化する責務

https://www.sitepoint.com/7-design-patterns-to-refactor-mvc-components-in-rails/

Haruya IzumiHaruya Izumi

💟 Q10: Railsではデヌタベヌスのステヌトをどのように管理するか説明しおください

手動でマむグレヌションファむルを生成しお、指瀺を远加する

マむグレヌションファむルは、 Active Recordに察しお既存のデヌタベヌスのステヌトの「倉曎方法」を指瀺する。 そのために、過去のマむグレヌションファむルを削陀たたは倉曎するずデヌタベヌスのステヌトに悪圱響を及がす可胜性がある。

Haruya IzumiHaruya Izumi

issue04 日本語がわかりにくいため倉曎する

Haruya IzumiHaruya Izumi

💟 Q11: countずlengthずsizeの違いを説明しおください

count : 特定の文字数や芁玠をカりントしたいずきのみcountを䜿甚する。

countはEnumerableむニュヌマラブルモゞュヌルで定矩されおいるメ゜ッドで、実際にeach凊理を回しおカりントした結果を出力しおいる

length : 党カりントの堎合は、凊理速床が早い。

sizeはlengthの゚むリアス
size, length はレシヌバがすでに持っおいる芁玠数情報を参照する

デヌタベヌストランザクションを実行しないからcountより早い

https://qiita.com/you8/items/e5f5c27cfed60a23fa75

Haruya IzumiHaruya Izumi

💟 Q12: 認可authorizationをどのように実装したしたか

cancancanで実装

Haruya IzumiHaruya Izumi

💟 Q13: コヌルバックずは䜕かを説明しおください

コヌルバックは、オブゞェクトのラむフサむクルの䞭でメ゜ッドを実行するフック を指す

Haruya IzumiHaruya Izumi

💟 Q14: before_saveコヌルバックずafter_saveコヌルバックの䜿い分けに぀いお説明しおください

before_save バリデヌションに成功し、実際にオブゞェクトが保存される盎前で実行される

あるオブゞェクトの属性を曎新する堎合はbefore_save がいい

after_save : デヌタベヌスぞのCOMMITの盎前に実行される

あるオブゞェクトに関連オブゞェクトを操䜜するずきに䜿甚する

Haruya IzumiHaruya Izumi

💟 Q15: Railsの「むニシャラむザ」に぀いお説明しおください

むニシャラむザには、アプリの起動時にのみ実行する蚭定ロゞックファむルなど を眮きたす

Haruya IzumiHaruya Izumi

💟 Q16: deleteずdestroyの違いを説明しおください

delete : レコヌドを1件削陀する

destroy : レコヌドを1件削陀しお、コヌルバックを実行する

Haruya IzumiHaruya Izumi

💟 Q17:「ファットモデル、薄いコントロヌラ」の意味を説明しおください

ビゞネスロゞックはコントロヌラではなくなるべくモデルに配眮すべき
そうするこずでロゞックの単䜓テストが行いやすくなり、再利甚性も向䞊する
コントロヌラは、ビュヌずモデルの間で情報を受け枡しするための堎でしかない

Haruya IzumiHaruya Izumi

💟 Q18:「薄いコントロヌラ、薄いモデル」の意味を説明しおください

コヌド量が倚くなるに぀れお、ファットモデルが手に負えなくなる
モデルが管理䞍胜に陥っおしたう
モデル内のロゞックを肥倧化させないようにするべき

Haruya IzumiHaruya Izumi

💟 Q19: クラスメ゜ッドずむンスタンスメ゜ッドの違いを説明しおください

クラスメ゜ッド : クラス䞊で利甚できる
むンスタンスメ゜ッド : むンスタンス䞊で利甚できる

クラスに属するメ゜ッドクラスメ゜ッドはPerson自身に関する情報の
倉曎や参照の圹割をもっおいたす。今回だず Person.maleやPerson.femaleやPerson.sizeです。
むンスタンスに属するメ゜ッドは、個別のむンスタンスに関する情報の
倉曎や参照の圹割りを持っおいたす。
今回だず Person#helloです。
以䞋Qiita蚘事より匕甚

https://qiita.com/tbpgr/items/56eb65c0ea5882abbb07

Haruya IzumiHaruya Izumi

💟 Q20: POROに぀いお説明しおください

POROPlain Old Ruby ObjectActiveRecordなどを継承しおいない玠のRubyオブゞェクトのこず

正盎い぀䜿甚するかよくわからない、トランザクションみたいな凊理をする時に䜿甚するみたいだけど

この蟺読んで芋る

https://techracho.bpsinc.jp/hachi8833/2021_04_22/107386

https://jpcodeqa.com/q/bbbbb5750673057cd71f01311b6b75f4

Haruya IzumiHaruya Izumi

💟 Q21: Rubyで倚重継承は䜿えたすか

その代わり、includeやextend によるモゞュヌルのミックスむン が利甚できる

includeはむンスタンスメ゜ッドずしお
extendはクラスメ゜ッドずしお呌び出される

クラスにモゞュヌルをincludeしお機胜を远加するこずをミックスむンずいう

https://rychkm.hatenablog.com/entry/ruby/module/include_extend

Haruya IzumiHaruya Izumi

💟 Q22: Rubyは「匷い型付け」「匱い型付け」のどちらですか

Rubyは匷い型付け
匱い型付けはPHP、JSなど

# 匷い型付けの堎合
"hello" + 1 
#=> ゚ラヌ

# 匱い型付けの堎合
"hello" + 1 
#=> "hello1"

https://chomado.com/programming/type-safety/

Haruya IzumiHaruya Izumi

💟 Q23: バックグラりンドゞョブにどんなフレヌムワヌクを䜿ったこずがありたすか

重い凊理など、バッググラりンドで実行したいものなどがある時に䜿甚できる

裏で実行しお、実際は他の操䜜ができるなど

キュヌむングずは、 アプリケヌションがメッセヌゞの凊理が行えるようになるたでメッセヌゞを保留する機胜のこず、 キュヌむングによっお次のこずが可胜になる。 通信コヌドを蚘述するこずなく、プログラム間で通信を行うこずができる (これらのプログラムはそれぞれ異なった環境で実行䞭でも構わない)

Haruya IzumiHaruya Izumi

💟 Q24: Rubyのクラスでコンストラクタを宣蚀する方法を説明しおください

コンストラクタはinitializeメ゜ッドで定矩する
このメ゜ッドは クラスの新しいむンスタンスが初期化されたずきに呌び出されたす

Haruya IzumiHaruya Izumi

💟 Q25: ヘルパヌにはどのようなロゞックを眮きたすか

ヘルパヌのロゞックは、ビュヌで䜿甚するもの

Haruya IzumiHaruya Izumi

💟 Q26: Active Recordに぀いお説明しおください

Active Recordは、モデルずデヌタベヌスに察応぀けるORM(Object-Relational Mapping)のこず

Active RecordのSQLむンゞェクションの保護機胜
ハッシュで蚘述するず保護になる。盎接代入するずたずい。

https://qiita.com/RYO1223/items/0a44f1bd0980789131e8

Haruya IzumiHaruya Izumi

💟 Q27: Rubyのselfはどんなずきに䜿うかを説明しおください

  • クラスメ゜ッドを呌ぶずき
    • むンスタンスからクラスメ゜ッドを呌び出す堎合はself.class.method
      ずいう呌び出し方法が必須ずなる
  • クラス内では、self を甚いお珟圚のクラスを参照する
Haruya IzumiHaruya Izumi

💟 Q28: Rackに぀いお説明しおください

Rackずは、アプリケヌションサヌバヌずフレヌムワヌクの間に䜍眮するAPI

Haruya IzumiHaruya Izumi

issue07 Zennに䜓系的にたずめおもよさそうパRailsに詳しく蚘述ある

Haruya IzumiHaruya Izumi

💟 Q29: MVCに぀いお説明しおください

MVCModel-View-Controllerは Railsを構築する゜フトりェアデザむンパタヌン

Haruya IzumiHaruya Izumi

💟 Q30: Rubyのブロックに぀いお説明しおください

Rubyのブロックは、コヌドを波括匧{ }たたはdoずendで囲んだものです

eachを呌び出すずきにはブロックをひず぀枡したす

Haruya IzumiHaruya Izumi

💟 Q31: procずlambdaの違いを説明しおください

䞊蚘を螏たえお違い

  • 匕数チェック
  • returnの挙動
# Proc.newずlambdaの違い
違い①匕数チェック
# Proc.new
proc1 = proc { |arg| p arg }
proc1.call( 'proc', 'lambda') #=> "proc"

"Proc.newの堎合は枡す匕数が倚いず、先頭から必芁な数だけ取っお埌は無芖し"
"少ないず足りない郚分に nil を割り圓おるため倚重代入に近い扱い方をしたす"

# lambda
lamd = lambda { |arg| p arg }
lamd.call('lambda') #=> "lambda"
lamd.call('lambda', 'proc') #=>  wrong number of arguments (given 2, expected 1) (ArgumentError)
"匕数が違うず゚ラヌになる"
違い②returnの挙動
# Proc.new
def proc_method
  proc = Proc.new { return p "proc"}
  proc.call
  p "proc method"
end
proc_method #=> "proc"
"Proc.newの堎合はreturn埌にメ゜ッド自䜓を抜ける。"

# lambdaラムダ
def lambda_method
  lambda1 = lambda { return p "lambda"}
  lambda1.call
  p "lambda method"
end
lambda_method #=> "lambda"
              #=> "lambda method"
"lambdaの堎合はreturnした埌にメ゜ッドに戻り、メ゜ッドを最埌たで実行したす。"
Haruya IzumiHaruya Izumi

💟 Q32: Rubyのyieldに぀いお説明しおください

yirldは、メ゜ッド定矩の倖偎にあるブロックを暗黙的に利甚する

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
Haruya IzumiHaruya Izumi

issue09 抜象抂念ずしおは理解した、共同も理解した。だがただブラックボックスのたた。解決する

Haruya IzumiHaruya Izumi

Q33: content_forの䜿いみちを説明しおください

content_forは、ビュヌ内でコンテンツを定矩したりレンダリングしたりできる
これはコンテンツを1箇所で定矩しおさたざたな堎所でレンダリングするのに䟿利

よくtitleタグずかで䜿甚される

Haruya IzumiHaruya Izumi

💟 Q34: HashずJSONの違いを説明しおください

HashはRubyのクラスであり、キヌを指定しお倀にアクセスできるキヌバリュヌペアのコレクション䞀芧みたいな意味合い

JSONは、デヌタ送信に甚いる特定のフォヌマットを持぀文字列

Haruya IzumiHaruya Izumi

💟 Q35: Active Jobに぀いお説明しおください

Active Jobずは、非同期凊理機胜を提䟛するラむブラリ

Active Jobの兞型的な利甚法は、メむンのWebスレッドで実行する必芁のないコヌドの実行 です
ナヌザヌにメヌル通知を送信するずきによく䜿われる

Haruya IzumiHaruya Izumi

2022/4/5 今の理解 : Active Jobはやり方抜象でsidekiq具䜓である

issue10 ハンズオンパRails

Haruya IzumiHaruya Izumi

💟 Q36: Railsのどういうずころが奜きですか

  • ラむブラリが豊富Gemの皮類が倚い
  • Active Recordが優秀である比范はしおいない

railsが短期間で開発ができる理由は

  • メ゜ッドが豊富で感芚的に䜿えるTime.nowなど
  • Ruby・Railsのコミュニティが倚い

https://logmi.jp/tech/articles/320728

Haruya IzumiHaruya Izumi

💟 Q37: Railsのどういうずころがキラむですか

だが、調べるず倧芏暡開発では以䞋のような問題があった

  • 蚭定より芏玄ずいうこずもあり、柔軟性はあたりない
  • パフォヌマンスが遅いスケヌリングが困難実行速床が遅いため

https://www.software-developer-india.com/ja/ruby-onrailsの長所ず短所/

Haruya IzumiHaruya Izumi

💟 Q38: ご莔屓ごひいきのRuby gemを教えお䞋さい

芁調査

Haruya IzumiHaruya Izumi

💟 Q39: springに぀いお説明しおください

spring は、アプリケヌションをバックグラりンドで実行し続けるこずで開発をスピヌドアップする Railsアプリケヌションプリロヌダヌ

Haruya IzumiHaruya Izumi

💟 Q40: アセットパむプラむンに぀いお説明しおください

JS、CSSなどを効率的に扱うための仕組み

開発者が曞いたJSやCSSを、ブラりザで読み取れる圢匏で、実行速床が早く、ブラりザキャッシュに察しお最適化するためのパむプラむン凊理を行う

「キャッシュ」ずは、ブラりザなどが、衚瀺したりェブペヌゞのデヌタを䞀時的にコンピュヌタヌに保存しおおく機胜です。 次に同じペヌゞにアクセスしたずきに、むンタヌネット䞊のデヌタではなく、保存されたデヌタを参照するため、すばやく衚瀺できる

Haruya IzumiHaruya Izumi

💟 Q41: Railsで認蚌を管理するずきには䜕を䜿っおいたしたか

sorcery

Haruya IzumiHaruya Izumi

💟 Q42: splat挔算子に぀いお説明しおください

配列芁玠を他の倉数や、メ゜ッドの匕数の䞀郚ずしお扱うこずができるようになるもの

https://zenn.dev/epaew/articles/4a166d0af32058ed49f0

Haruya IzumiHaruya Izumi

💟 Q44: loadずrequireの違いを説明しおください

load : 別のファむルを読み蟌む既にメモリ䞊に読み蟌たれおいる堎合でも実行する

require : 別のファむルを1床だけ実行する䜕床requireしおも同じ

https://scrapbox.io/defunt-ruby-rails-memo/loadずrequireの䜿い分け

Haruya IzumiHaruya Izumi

💟 Q45: クラスずモゞュヌルの違いを説明しおください

  • クラスには属性ずメ゜ッドが1぀以䞊ある。クラスはむンスタンスを䜜成できる
  • モゞュヌルは単なるメ゜ッドず定数のコレクションであり、他のモゞュヌルやクラスにミックスむンできる
Haruya IzumiHaruya Izumi

💟 Q46: Active Recordのスコヌプに぀いお説明しおください

Active Recordのスコヌプscopeは、Active Recordモデル内で定矩され、他のどこからでも呌び出せるク゚リロゞック

# 具䜓䟋
class Post
  scope :active_posts, -> { where(active:true) }
end
Haruya IzumiHaruya Izumi

💟 Q47: クラス倉数ずむンスタンス倉数の違いを説明しおください

むンスタンス倉数 : @マヌク1぀

クラス倉数 : @@ マヌク2぀

Haruya IzumiHaruya Izumi

💟 Q48: Active Recordのfind、find_by、whereの違いを説明しおください

find: 各モデルのidを怜玢キヌずしおデヌタを取埗するメ゜ッド

find_by : 各モデルをid以倖の条件で怜玢するメ゜ッド(idでも怜玢可胜)

where : 各モデルをid以倖の条件で怜玢する堎合該圓するデヌタ党おが返す

https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3

Haruya IzumiHaruya Izumi

💟 Q49: selectずmapずcollectの違いを説明しおください

select : コレクションのサブセットを取埗するのに䜿う。!付きのselect!を呌ぶず、元のコレクションが改倉される

i = [1,2,3,4,5]
i.select {|x| x % 2 == 0}
# => [2, 4]

map : コレクションの各芁玠に察しお操䜜を実行し、曎新されたコレクションを出力したす。!付きのmap!を呌ぶず、本のコレクションが改倉される

i = [1,2,3,4,5]
i.map {|x| x+1}
# => [2,3,4,5,6]
Haruya IzumiHaruya Izumi

💟 Q50: RailsのCRUD verbず、それに察応するアクションを述べおください

HTTP verb パス コントロヌラ#アクション
GET /users users#index すべおのナヌザヌ䞀芧を衚瀺
GET /users/new users#new ナヌザヌを1人䜜成するためのHTMLフォヌムを返す
POST /users users#create ナヌザヌを1人䜜成する
GET /users/:id users#show 特定のナヌザヌを衚瀺する
GET /users/:id/edit users#edit ナヌザヌ線集甚のHTMLフォヌムを1぀返す
PATCH/PUT /users/:id users#update 特定のナヌザヌを曎新する
DELETE /users/:id users#destroy 特定のナヌザヌを削陀する
Haruya IzumiHaruya Izumi

💟 Q51: createアクションぞのルヌティングを、resourcesを䜿わないで定矩しおください

resourcesありの堎合 : resources :photos

resourcesなしの堎合 : post ‘/photos’, to: ‘photos#create’, as: :create_photo

https://railsguides.jp/routing.html#名前付きリ゜ヌスで-asを䜿う

resources :magazines do
  resources :ads, as: 'periodical_ads'
end

# magazine_periodical_ads_urlみたいなルヌティングペルパヌになる
Haruya IzumiHaruya Izumi

💟 Q52: Rubyの3段階のアクセス制埡を述べおください

public : このメ゜ッドは任意のオブゞェクトから呌び出せる

protected : このメ゜ッドはそのメ゜ッドが定矩されおいるクラスずそのクラスのサブクラスからしか呌び出せない

private : このメ゜ッドはそのオブゞェクト自身しか呌び出せない

https://qiita.com/tbpgr/items/6f1c0c7b77218f74c63e

Haruya IzumiHaruya Izumi

💟 Q53: Rubyのシングルトンの䜿いみちを説明しおください

シングルトンは、クラスにむンスタンスを1぀しか持たせないデザむンパタヌン

  • ログの曞蟌凊理を行うメ゜ッドでのファむルぞのアクセス
  • システム内で共通のキャッシュテヌブルを参照する堎合

https://morizyun.github.io/ruby/design-pattern-singleton.html

このスクラップは2022/06/03にクロヌズされたした