@yosaku_ibs

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

オブジェクト作成をしている理由

Q&A

Closed

解決したいこと

某Ruby on Railsのテキストからの質問です。
上から4行目の場所で「@user = User.new(user_params)」というコードが書かれており、オブジェクトが新規作成されているのですが、なぜオブジェクトを新規作成しているのかその必要性を知りたいです。


  def create
    user_params = params.require(:user).permit(:name, :email, :password,
:password_confirmation)
  @user = User.new(user_params) 
  if @user.save
    flash[:notice] = "登録しました"
    # どこかへリダイレクト 
  else
    flash.now[:alert] = "登録に失敗しました"
    render "new" 
    end
  end

自分で試したこと

ネットで「ruby オブジェクト 新規作成 どんなとき」などで調べましたが
解決に繋がる情報にたどり着けませんでした。

ご存じの方、ご教示下さいませんでしょうか?
以上、よろしくお願い申し上げます。

1 likes

2Answer

ここで User をインスタンス化する理由は Ruby on Rails 固有の仕組み、その中でも Active Record の仕組みを理解する必要があります。

Active Record の基礎 - Railsガイド

Active Record の役割は、「データベースのデータを Ruby のオブジェクトとして扱えるようにする」「ユーザーが入力したデータが適切かどうかチェックし、それをデータベースにうまく保存する」ことです。

Active Record を使うと、データベースと Ruby のオブジェクトを橋渡しする機能を持ったクラスを作れます。このクラスは特に Active Record モデルと呼ばれます。

Rails が用意した ApplicationRecord クラスを継承したクラスは Active Record モデルになります。 User も(テキスト通りに作れば) ApplicationRecord を継承しているので Active Record モデルのひとつです。

Active Record モデルはインスタンスを作ったり .save メソッドを呼んだりするだけで多くのことを行います。ご質問のコードを例に取ると:

  @user = User.new(user_params) 
  if @user.save
    ...

User.new(user_params) は、ユーザーが入力したパラメータが入っている user_params を受け取り、そのデータを元にインスタンスを作ります。

続く @user.save は、インスタンスに正しいパラメータが入っているか(たとえば name が空ではないか、 email がメールアドレスになっているか)をチェックして、正しければそれをデータベースに保存します。入っていなければ保存せず、 @user.errors にエラーの理由(正しくないパラメータの名前など)をセットします。

このように、ただインスタンスを作っているだけに見えて裏では多くのことが起こっています。特に Rails は「設計より規約」といって、 Rails 固有のルールに従えば表面上のコードが簡潔になる思想のフレームワークです。逆に言えば数行のコードが複雑な処理を引き起こすため、何が起こるかはルールを熟知しないと分かりづらくなっています。 Ruby の一般的な記事よりも、 Rails のテキストや Rails ガイドをよく調べてみてください。

2Like

Comments

  1. @yosaku_ibs

    Questioner

    @uasi様

    あけましておめでとうございます。
    早速ご回答くださり誠にありがとうございます。
    詳細なご説明ありがとうございます。
    Railsガイドで調べてみようと思います。
    ありがとうございます。

インスタンス化の話ですよね。

理由としては、
クラスなどの定義に基づいて実行時にメモリ上に領域を確保し、実際にデータの集合体を生成するためです。

どんな時にインスタンス化したいかとしては、
クラスの機能を使いたい時です。

メリットとしては、
呼び出すごとに初期化されて、前の仕様を気にしなくていいことです。

詳しくは、以下を参照していただけと、

0Like

Comments

  1. @yosaku_ibs

    Questioner

    @sugiyama404様

    あけましておめでとうございます。
    早速ご回答くださり誠にありがとうございます。
    クラスの機能を使いたいときにインスタンス化するとのことですが
    今回のコードの場合は、saveメソッドを使うためにインスタンス化したということで
    差し支えございませんでしょうか?
  2. >saveメソッドを使うためにインスタンス化したということで
    差し支えございませんでしょうか?

    私もそう理解しています。
  3. @yosaku_ibs

    Questioner

    迅速なご回答誠にありがとうございます。
    大変励みになりました。
    貴重なお時間を割いてご教示くださり誠にありがとうございました。

Your answer might help someone💌