

# 解決したいこと

HerokuSchedullerを使い、こちらが指定した時間で、rake
taskを実行させたいのですが、実行させるメール送信機能のPreview（`test/mailers/previews/alert_mailer_preview.rb`）にエラーが発生しており、解決したいと考えております。

エラー内容：wrong number of arguments (given 0, expected 1)

userを引数として渡しているはずなのに、Preview画面では一向に変わらずお手上げ状態です。お力貸して頂けますと幸いです。

[![画像の説明をここに入力](https://i.stack.imgur.com/0ENrf.png)](https://i.stack.imgur.com/0ENrf.png)

この後の **「send_alert」** をクリックすると、下記の通り、「引数が間違っている（wrong number of arguments
(given 0, expected 1)）」と怒られてしまいます。

[![画像の説明をここに入力](https://i.stack.imgur.com/2ZHdf.png)](https://i.stack.imgur.com/2ZHdf.png)

# 環境

Ruby:2.6.5  
Rails：5.2.4  
DB:PostgreSQL  
Heroku Scheduller

# コード

**mailers/previews/alert.mailer_previrew.rb**

[code]

    # Preview all emails at http://localhost:3000/rails/mailers/alert_mailer
    class AlertMailerPreview < ActionMailer::Preview
      def send_alert(user)
        @user = user
        mail(
          to: @user.email,
          subject: '練習記録を登録しましょう！'
        )
        # mail to: "#{@user.email}", subject: "Hello,#{@user.email}"
        # mail to: user.email, subject: '練習記録を登録しましょう！'
      end
    end
    app/mailers/application_mailer.rb
    
    class ApplicationMailer < ActionMailer::Base
      default from: 'noreply@example.com'
      layout 'mailer'
    end
    
[/code]

**terminal**

[code]

    Started GET "/rails/mailers/alert_mailer/send_alert" for ::1 at 2020-06-30 15:53:55 +0900
    Processing by Rails::MailersController#preview as HTML
      Parameters: {"path"=>"alert_mailer/send_alert"}
    Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)
    
    ArgumentError - wrong number of arguments (given 0, expected 1):
      test/mailers/previews/alert_mailer_preview.rb:3:in `send_alert'
    
    Started POST "/__better_errors/30c7823ed90f92ce/variables" for ::1 at 2020-06-30 15:53:55 +0900
    
[/code]

**app/views/alert_mailer/send_alert.html.slim**  
**app/views/alert_mailer/send_alert.text.html.slim**

[code]

    = user.mail 様
    
    この度は「TTManager」を利用頂きましてありがとうございます。
    br/
    練習記録の登録はお済みですか？お済みでない場合は、こちらからログインをお願い致します。
    br/
    = link_to 'https://vast-anchorage-69571.herokuapp.com/', do
      | ログインはこちら
      span
    
[/code]

**app/models/user.rb**

[code]

    class User < ApplicationRecord
      # Include default devise modules. Others available are:
      # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
      devise :database_authenticatable, :registerable,:recoverable, :rememberable, :validatable, password_length: 6..128
      has_many :records
    
      def self.guest
        find_or_create_by(email: "guest@example.com") do |user|
          user.password = SecureRandom.urlsafe_base64
              # user.confirmed_at = Time.now  # Confirmable を使用している場合は必要
        end
      end
    end
    
[/code]

**app/mailers/alert.mailer.rb**

[code]

    class AlertMailer < ApplicationMailer
      def send_alert(user)
        @user = user
        mail to: @user.email, subject: '練習記録を登録しましょう！'
        # mail to: "#{@user.email}", subject: "Hello,#{@user.email}"
        # mail to: user.email, subject: '練習記録を登録しましょう！'
      end
    end
    
[/code]


CC BY-SA 4.0
2020-06-30T12:18:39.343
68150
2020-07-03T00:15:31.587
2020-07-03T00:12:50.023
3060
39475
question
ruby-on-rails ruby gmail
ActionMailerのPreview起動時に、引数が間違っている（wrong number of arguments (given 0, expected 1)）と怒られるので解消したい


# 解決した方法

**mailers/previews/alert.mailer_previrew.rb**
を下記のように変更すると、「引数が間違っている」というエラーが解消しました。別のエラー（No Method
Error）が発生していますが、そちらは自分で解決策考えようと思います（nakanishiさん、ご指摘頂きありがとうございました）。

### 修正前のコード

[code]

    class AlertMailerPreview < ActionMailer::Preview
      def send_alert(user)
        @user = user
        mail(
          to: @user.email,
          subject: '練習記録を登録しましょう！'
        )
        # mail to: "#{@user.email}", subject: "Hello,#{@user.email}"
        # mail to: user.email, subject: '練習記録を登録しましょう！'
      end
    end
    
[/code]

### 修正後のコード

[code]

    class AlertMailerPreview < ActionMailer::Preview
      def send_alert
        @user = User.all
        AlertMailer.send_alert(@user)
      end
    end
    
[/code]

### やったこと

  1. `alert_mailer_preview.rb` では 引数 `(user)` を消した
  2. 全ユーザーへの送信をテストしたいと思ったので、`@user = User.all` に変更した
  3. 他Qiitaの記事を見て、`Mailer.アクション名(引数)` と記載した


CC BY-SA 4.0
2020-07-02T23:39:31.293
68230
2020-07-03T00:15:31.587
2020-07-03T00:15:31.587
3060
39475
68150
answer