質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

950閲覧

railsでinitializeを使うメリットについて

hase744

総合スコア57

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/12/12 11:57

railsでインスタンスメソッドでクラスを呼び出す際にinitializeを使うメリットってありますか?
例えば下記ののようにSessionsControllerクラスでAuthenticatorクラスのauthenticateメソッドを呼び出すのですがその時に引数をメソッドではなくクラスに設定するにするメリットはありますか?

ruby

1class Staff::Authenticator 2 def initialize(staff_member) 3 @staff_member = staff_member 4 end 5 6 def authenticate(raw_password) 7 @staff_member && 8 !@staff_member.suspended? && 9 @staff_member.hashed_password && 10 @staff_member.start_date <= Date.today && 11 (@staff_member.end_date.nil? || @staff_member.end_date > Date.today) && 12 BCrypt::Password.new(@staff_member.hashed_password) == raw_password 13 end 14end

ruby

1class Staff::SessionsController < Staff::Base 2 def create 3 @form = Staff::LoginForm.new(params[:staff_login_form]) 4 5 if @form.email.present? 6 staff_member = StaffMember.find_by("LOWER(email) = ?", @form.email.downcase) 7 end 8 if Staff::Authenticator.new(staff_member).authenticate(@form.password) 9 session[:staff_member_id] = staff_member.id 10 redirect_to :staff_root 11 else 12 render action: "new" 13 end 14 end 15end

ではなく

ruby

1class Staff::Authenticator 2 def authenticate(staff_member, raw_password) 3 staff_member && 4 !staff_member.suspended? && 5 staff_member.hashed_password && 6 staff_member.start_date <= Date.today && 7 (staff_member.end_date.nil? || staff_member.end_date > Date.today) && 8 BCrypt::Password.new(staff_member.hashed_password) == raw_password 9 end 10end

ruby

1class Staff::SessionsController < Staff::Base 2 def create 3 @form = Staff::LoginForm.new(params[:staff_login_form]) 4 5 if @form.email.present? 6 staff_member = StaffMember.find_by("LOWER(email) = ?", @form.email.downcase) 7 end 8 if Staff::Authenticator.new.authenticate(staff_member,@form.password) 9 session[:staff_member_id] = staff_member.id 10 redirect_to :staff_root 11 else 12 render action: "new" 13 end 14 end 15end

でも動作は変わらないと思うのですがどう違いますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

メリット・デメリットというよりは、どのように使いたいのかというところがポイントになると思います。

例えば、このように使いたいと考えたら

ruby

1Staff::Authenticator.authenticate(staff_member, raw_password)

こうなりますし、

ruby

1class Staff::Authenticator 2 3 def self.authenticate(staff_member, raw_password) 4 ... 5 end 6 7end

インスタンスを作ってから使いたいなら最初のコードのようになります。

ruby

1authenticator = Staff::Authenticator.new(staff_member) 2authenticator.authenticate(raw_password) 3 4 5class Staff::Authenticator 6 7 def initialize(staff_member) 8 @staff_member = staff_member 9 end 10 11 def authenticate(raw_password) 12 ... 13 end 14 15end

どっちを使っても間違いではありません。

投稿2021/12/12 12:58

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

1つのメソッドに処理を全部書いてしまうのであれば、インスタンス変数である意味はあまりありません。

一方で、メソッドを分割するとなった場合に、インスタンス変数があれば、それは共通して使えるので、メソッドごとに引き回す必要がなく、きれいに書けます。

投稿2021/12/12 12:17

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問