91637


### 前提

自作アプリのdatetime型のカラムにデータが，コントローラの記述で正しく入れられません．（Rails c では入れられます．以下の試したことに記載）  
イマイチなんでかわからないので，皆さんの力を貸してください．

### 実現したいこと

User作成時点で，created_atのようなdatetime型のデータを入れたいです．

### 発生している問題・エラーメッセージ

[["email", "xxxxx.com"],  
["encrypted_password", "[FILTERED]"],  
["created_at", "2022-10-16 21:32:18.541640"], ["updated_at", "2022-10-16
21:32:18.541640"], ["name", "xxxx"], ["birthday", "2022-09-25"],
["received_at", nil]]

このreceived_atがUser作成時点でcreated_atらと同様に入っていてほしいです．

### 該当のソースコード

[code]

    before_action :authenticate_user!
    
      def new
        @user = User.new
      end
    
      def initialize
        @user.received_at = params[received_at: :Time.current]
      end
    
      def create
        @user = User.new(user_params)
        @user.received_at = Time.now
        if @user.save
          @user.send_activation_email
          flash[:info] = "Please check your email to activate your account."
          redirect_to root_url, notice: "Please check your email to activate your account."
        else
          render 'new'
        end
      end
    
    
[/code]

### 試したこと

実はこのアプリ自体作り直していて，その際は以下のコードで動いていました．（received_atが期待通りの値を取得していた．）

[code]

      def initialize
        @user.received_at = params[received_at: :Time.now]
      end
    
    
      def create
        @user = User.new(user_params)
        #params[:user]実装は終わっていないことに注意!
        #マスアサインメント脆弱性
        if @user.save
          @user.send_activation_email
          flash[:info] = "Please check your email to activate your account."
          redirect_to root_url, notice: "Please check your email to activate your account."
        else
          render 'new'
        end
      end
    
[/code]

なので，一旦そのままコードをコピペしたらなぜか動かなくて，？？？ってなっています．

また，コンソールから確認してみたらそっちではできたので，カラムを追加していないとか，そういったことではなさそうです．

[code]

    irb(main):001:0> user = User.create
      TRANSACTION (0.1ms)  BEGIN
    => #<User id: nil, email: "", created_at: nil, updated_at: nil, name: nil, birthday: nil, received_at: nil>
    irb(main):002:0> user.received_at = Time.now
    => 2022-10-16 21:04:36.530002067 +0900
    irb(main):003:0> p user
    #<User id: nil, email: "", created_at: nil, updated_at: nil, name: nil, birthday: nil, received_at: "2022-10-16 21:04:36.530002000 +0900">
    => #<User id: nil, email: "", created_at: nil, updated_at: nil, name: nil, birthday: nil, received_at: "2022-10-16 21:04:36.530002000 +0900">
    
[/code]

### 補足情報（FW/ツールのバージョンなど）

Ruby 3.1.2  
Rails 7.0.4  
Devise Gem でユーザー登録実装


CC BY-SA 4.0
2022-10-16T12:52:40.690
91632
2022-10-16T17:05:18.610
40091
question
ruby-on-rails ruby devise
Rails でdatetime型の値を正しく入れられません．


`received_at` は `rails generate migration AddReeivedAtToUser
received_at:datetime` などで users テーブルにカラムを追加するマイグレーションを作成し、`rails db:migrate` で
DB に反映されているでしょうか? app/models/user.rb の User クラスに `attribute :received_at,
:datetime` を追加して済ませていないでしょうか?

後者の場合、rails 上で仮想的なカラムが追加されるだけで save しても DB には反映されません。※DB の users
テーブルにはカラム自体が存在しない。

「rails console では入れられる」とのことですが、DB に反映できているか確認されているでしょうか? 具体的には `user.save;
user.reload` の様に save 後に reload で DB から読み込み直すと `received_at` が nil
になっていないでしょうか?

「アプリ自体作り直していて」とのことですが、マイグレーションファイルの内容は引き継げているでしょうか?

以上の点をまず確認されると良いと思います。

と、実は `received_at` が登録されない件とは直接関係ないと思うので、以降は興味本位の内容です。  
提示されたコードに含まれる `initialize` メソッドには突っ込み所が多いです。実際存在するのでしょうか?  
突っ込み所:

  1. 先の回答にある通り、通常 `initialize` を書きません。
  2. その上で、`initialize` が実行されるタイミングでは `@user` は nil (存在しない)ので `@user.received_at = ` はエラー `undefined method 'received_at=' for nil:NilClass` が発生するはずです。
  3. `initialize` 内での `params[...]` はエラー `undefined method 'filered_parameters' for nil:NilClass` が発生します。※私も詳しくは理解していませんが、Rails 7.0.4 で発生しました。
  4. `:Time.current` とされていますが、 `:Time` はクラスではなくシンボルです。なので `undefined method 'current' for :Time:Symbol` というエラーが発生するはずです。
  5. `params[recieved_at: Time.current]` は `{ received_at: Time.current }` というキーで `params` から値と取得するものです。通常 params はハッシュをキーとした値を持たないので `nil` になると思います。なので仮に 2~4 の問題がないとしても `@user.received_at =` には `nil` が代入されると思います。


CC BY-SA 4.0
2022-10-16T17:05:18.610
91637
2022-10-16T17:05:18.610
54859
91632
answer