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

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

ただいまの
回答率

90.45%

  • Ruby

    9694questions

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

  • Ruby on Rails 5

    3384questions

  • TestNG

    9questions

    TestNGは、Javaのためのテスティングフレームワーク。JUnitとNUnitにインスパイアを受け開発されました。ユニットテストに限らず、機能テストや統合テストも行うことが可能です。

rails チュートリアル 11章 送信メールのテンプレートでのエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 597

Rand

score 6

railsチュートリアル11章でエラーが解決できないので質問致します。
原因がわかる方いらっしゃいましたらご回答頂けると助かります。

参考サイトURL
https://railstutorial.jp/chapters/account_activation?version=5.1#cha-account_activation

11章のリスト11.11、リスト11.12それぞれのソースコードに書き換えると
以下のようなエラーになります。

リスト11.11書き換え時テスト(app/mailers/application_mailer.rb)

 FAIL["test_account_activation", UserMailerTest, 0.8271147690011276]
 test_account_activation#UserMailerTest (0.83s)
        Expected: ["from@example.com"]
          Actual: ["noreply@example.com"]
        test/mailers/user_mailer_test.rb:8:in `block in <class:UserMailerTest>'

 FAIL["test_password_reset", UserMailerTest, 0.8365001729998767]
 test_password_reset#UserMailerTest (0.84s)
        Expected: ["from@example.com"]
          Actual: ["noreply@example.com"]
        test/mailers/user_mailer_test.rb:16:in `block in <class:UserMailerTest>'


リスト11.12書き換え時テスト(app/mailers/user_mailer.rb)

ERROR["test_account_activation", UserMailerTest, 1.0617286130000139]
 test_account_activation#UserMailerTest (1.06s)
ArgumentError:         ArgumentError: wrong number of arguments (given 0, expected 1)
            app/mailers/user_mailer.rb:3:in `account_activation'
            test/mailers/user_mailer_test.rb:6:in `block in <class:UserMailerTest>'


両方書き換えてからテスト

ERROR["test_account_activation", UserMailerTest, 1.307518630001141]
 test_account_activation#UserMailerTest (1.31s)
ArgumentError:         ArgumentError: wrong number of arguments (given 0, expected 1)
            app/mailers/user_mailer.rb:3:in `account_activation'
            test/mailers/user_mailer_test.rb:6:in `block in <class:UserMailerTest>'

 FAIL["test_password_reset", UserMailerTest, 1.3199689709999802]
 test_password_reset#UserMailerTest (1.32s)
        Expected: ["from@example.com"]
          Actual: ["noreply@example.com"]
        test/mailers/user_mailer_test.rb:16:in `block in <class:UserMailerTest>'


チュートリアル通りではありますが、
11章からエラーになるところまでの手順で更新したファイルは以下になります。
順に追っていきます。

config/routes.rb

Rails.application.routes.draw do
  root   'static_pages#home'
  get    '/help',    to: 'static_pages#help'
  get    '/about',   to: 'static_pages#about'
  get    '/contact', to: 'static_pages#contact'
  get    '/signup',  to: 'users#new'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users
  resources :account_activations, only: [:edit]
end


$ rails generate migration add_activation_to_users activation_digest:string activated:boolean activated_at:datetimeを実行してデータモデルを追加

db/migrate/[timestamp]_add_activation_to_users.rb

class AddActivationToUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :activation_digest, :string
    add_column :users, :activated, :boolean, default: false
    add_column :users, :activated_at, :datetime
  end
end


$ rails db:migrateを実行

app/models/user.rb

class User < ApplicationRecord
  attr_accessor :remember_token, :activation_token
  before_save   :downcase_email
  before_create :create_activation_digest
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                      format: { with: VALID_EMAIL_REGEX },  #6.21: メールフォーマットを正規表現で検証
                    uniqueness: { case_sensitive: false }   #6.27: メールアドレスの大文字小文字を無視した一意性の検証
  has_secure_password  #リスト 6.37
  #10.13: パスワードが空のままでも更新できるようにする
  validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 

  # 渡された文字列のハッシュ値を返す
  def User.digest(string)  #8.21: fixture向けのdigestメソッドを追加
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end

  # ランダムなトークンを返す
  def User.new_token # 9.2: トークン生成用メソッド
    SecureRandom.urlsafe_base64
  end

  # 永続セッションのためにユーザーをデータベースに記憶する
  def remember #9.3: rememberメソッドをUserモデルに追加
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end

  # 渡されたトークンがダイジェストと一致したらtrueを返す
  def authenticated?(remember_token)  #9.6: authenticated?をUserモデルに追加
    return false if remember_digest.nil?  #9.19: authenticated?を更新して、ダイジェストが存在しない場合に対応
    BCrypt::Password.new(remember_digest).is_password?(remember_token)
  end

  # ユーザーのログイン情報を破棄する
  def forget #9.11: forgetメソッドをUserモデルに追加
    update_attribute(:remember_digest, nil)
  end
  private

  # メールアドレスをすべて小文字にする
  def downcase_email
    self.email.downcase!
  end

  # 有効化トークンとダイジェストを作成および代入する
  def create_activation_digest
    self.activation_token  = User.new_token
    self.activation_digest = User.digest(activation_token)
  end
end


db/seeds.rb

User.create!(name:  "Example User",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar",
             admin: true,   #10.55: サンプルデータ生成タスクに管理者を1人追加
             activated: true,
             activated_at: Time.zone.now)

99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password,
               activated: true,
               activated_at: Time.zone.now)
end


test/fixtures/users.yml

#8.22: ユーザーログインのテストで使うfixture
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>
  admin: true   #10.60: fixture内の最初のユーザーを管理者にする
  activated: true
  activated_at: <%= Time.zone.now %>

#10.23: fixtureファイルに2人目のユーザーを追加
archer:
  name: Sterling Archer
  email: duchess@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

#10.47: fixtureにさらに30人のユーザーを追加
lana:
  name: Lana Kane
  email: hands@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

malory:
  name: Malory Archer
  email: boss@example.gov
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>

<% 30.times do |n| %>
user_<%= n %>:
  name:  <%= "User #{n}" %>
  email: <%= "user-#{n}@example.com" %>
  password_digest: <%= User.digest('password') %>
  activated: true
  activated_at: <%= Time.zone.now %>
<% end %>


$ rails db:migrate:reset
$ rails db:seed
上記二つのコマンドを実行後、以下のコマンドでUserメイラーの生成
$rails generate mailer UserMailer account_activation password_reset

その後リスト11.11でapp/mailers/application_mailer.rbを変更

class ApplicationMailer < ActionMailer::Base
  default from: "noreply@example.com"
  layout 'mailer'
end


app/mailers/user_mailer.rbを変更

class UserMailer < ApplicationMailer

  def account_activation(user)
    @user = user
    mail to: user.email, subject: "Account activation"
  end

  def password_reset
    @greeting = "Hi"

    mail to: "to@example.org"
  end
end


ちなみにrailsサーバの再立ち上げやリセット、ファイルの保存は行ってます。
宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Ruby on Rails チュートリアルの内容を確認したのですが、その時点でテストを行う指示はでていないので、テストを行わなくてもいいと思います。

次にテストを行うのは

リスト 11.20: 現在のメールの実装をテストする red

だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/15 11:07

    その先のテストの段階でNGだったため少し遡ってテストしてました。
    実際は別のところで問題があったためこの段階でテストしてはいけなかったみたいです。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    9694questions

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

  • Ruby on Rails 5

    3384questions

  • TestNG

    9questions

    TestNGは、Javaのためのテスティングフレームワーク。JUnitとNUnitにインスパイアを受け開発されました。ユニットテストに限らず、機能テストや統合テストも行うことが可能です。