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

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

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

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

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

1回答

1660閲覧

Mailerクラスのspecが上手く通りません。Couldn't find Book without an ID というエラーが出ます。

qaz3330

総合スコア113

Ruby

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

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/10/09 12:34

編集2015/10/10 01:23

ruby 2.2.2p95
Rails 4.2.1
Mac Yossemite

Mailerクラスのrspecを記述しているのですが、上手く通りません。

Mailer内で、Bookモデルからインスタンスを生成しているのですが、それをrspecで記述したいのですが、以下のエラーが出ます。

Couldn't find Book without an ID

Mailerクラスには以下のように記述してます。

class TestMailer < ApplicationMailer b = Book.find(user_id) @book_title = b.title end

また、generatorで生成されたrspecは以下になります。

it "renders the headers" do expect(mail.subject).to eq("reports") expect(mail.to).to eq(["to@example.org"]) expect(mail.from).to eq(["from@example.com"]) end it "renders the body" do expect(mail.body.encoded).to match("Hi") end

このspec内に、

b = Book.new

みたいな処理をいれて、specを通すのかなと思ったのですが、

"renders the headers"

"renders the body"

の2つのspecに対して、どのように記述したらいいのかがわからず、ググッていたのですが、
よくわからなかったため、質問させて頂きました。

宜しくお願いします。

※不足している情報があれば追記致します。


追記

情報に不備があったため、追記致します。

reportメソッド内でbook_idを指定します。
そのbook_idを元にfindで探し、そのタイトルをメール送信するという流れです。

質問文でなぜかuser_idと記述してしまい、誤解を招きました。申し訳ありません。

class TestMailer < ApplicationMailer def report(book_id: nil) b = Book.find(book_id) @book_title = b.title end end

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

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

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

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

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

guest

回答1

0

find() は nil を渡すと
Couldn't find xxx without an ID
の例外を返すようです。
参考: http://mat5ukawa.hateblo.jp/entry/2013/12/23/013650

質問の箇所 Book.find(user_id) で user_id に何が設定されているかを確認してみては?
user_id が設定されていないのだと想像されます。
(ソース全体がないので想像しかできません)

投稿2015/10/09 22:58

katoy

総合スコア22324

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

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

qaz3330

2015/10/10 01:26

ご回答ありがとうございます。 user_idと記述しておりましたが、私のミスで、book_idのことです。 書き間違えで申し訳ありません。 reportメソッド内でbook_idを指定します。 そのbook_idを元にfindで探し、そのタイトルをメール送信するという流れです。 質問文でなぜかuser_idと記述してしまい、誤解を招きました。申し訳ありません。 class TestMailer < ApplicationMailer def report(book_id: nil) b = Book.find(book_id) @book_title = b.title end end specでもbook_idがわからないままfind()をしているためのエラーということはわかったのですが、それに対して、どのようにspec内でbook_idをしていしてあげればよいのかがわかりませんでした・・・。
qaz3330

2015/10/10 01:27

特に、"renders the headers" のspecでは、 メールの送信情報などに関するspecかと思われるのですが、ここにどのようにbook_idを絡めたspecをかけばいいのかがわかりません・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問