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

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

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

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

Ruby on Rails 4

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

Q&A

解決済

1回答

2311閲覧

【Ruby on Railsチュートリアル】【第11章】timesメソッドで生成したテストデータがエラーになります。

gogoackman3

総合スコア109

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2016/06/27 14:04

編集2016/06/27 14:08

###前提・実現したいこと
Railsチュートリアルのリスト11.26: ユーザーと関連付けされたマイクロポストのfixtureを生成する部分で、テスト(後述)を実行するとエラーが発生します。
原因は理解できていますが、解決方法が分かりかねています。

該当チュートリアルページ:http://railstutorial.jp/chapters/user_microposts?version=4.2#cha-user_microposts

ポストされた投稿が30件以上になるとページャーが生成されるのですが、それを確認するテストです。

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

ERROR["test_profile_display", UsersProfileTest, 2016-06-27 05:55:35 +0000] test_profile_display#UsersProfileTest (1467006935.95s) ActiveRecord::StatementInvalid: ActiveRecord::StatementInvalid: SQLite3::SQLException: table microposts has no column named micropost_0: INSERT INTO "microposts" ("content", "created_at", "micropost_0", "micropost_1", "micropost_2", "micropost_3", "micropost_4", "micropost_5", "micropost_6", "micropost_7", "micropost_8", "micropost_9", "micropost_10", "micropost_11", "micropost_12", "micropost_13", "micropost_14", "micropost_15", "micropost_16", "micropost_17", "micropost_18", "micropost_19", "micropost_20", "micropost_21", "micropost_22", "micropost_23", "micropost_24", "micropost_25", "micropost_26", "micropost_27", "micropost_28", "micropost_29", "updated_at", "id", "user_id") VALUES ('Rem eligendi totam est sed ut dolore consectetur vitae.', '2016-05-16 13:15:37 UTC', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2016-06-27 13:15:38', 941832919, 762146111)

※このテスト以外の50個ほどのテストでも同じエラーが発生します。

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

ページャーを表示させるために30個以上のテストデータをFaker::Loremとtimesメソッドを利用し、生成しているのが以下のコードです。

Ruby

1microposts.yml 2<% 30.times do |n| %> 3micropost_<%= n %>: 4content: <%= Faker::Lorem.sentence(5) %> 5created_at: <%= 42.days.ago %> 6user: michael 7<% end %>

Ruby

1users.yml 2michael: 3 name: Michael Example 4 email: michael@example.com 5 password_digest: <%= User.digest('password') %> 6 admin: true 7 activated: true 8 activated_at: <%= Time.zone.now %>

テストコードは以下の通りです。

Ruby

1def setup 2 @user = users(:michael) 3end 4 5test "profile display" do 6 get user_path(@user) 7 assert_template 'users/show' 8 assert_select 'title', full_title(@user.name) 9 assert_select 'h1', text: @user.name 10 assert_select 'h1>img.gravatar' 11 assert_match @user.microposts.count.to_s, response.body 12 assert_select 'div.pagination' 13 @user.microposts.paginate(page: 1).each do |micropost| 14 assert_match micropost.content, response.body 15 end 16end

エラーの内容は理解出来ています。
micropostsテーブルにはmicropost_0というカラムはありません。という意味です。
事実、そのようなカラムはありません。

###試したこと
micropostそのものを量産したいのになぜかmicropostの中にmicropostを作るような感じになっているのだと理解し、以下の通り、Faker::Loremに頼らずに、自分でテストデータを数十個直書きしました。

Ruby

1most_recent1: 2content: "Writing a short test" 3created_at: <%= 42.days.ago %> 4user: michael 5 6most_recent2: 7content: "Writing a short test" 8created_at: <%= 42.days.ago %> 9user: michael

結果、自分でテストデータを書いた場合は、問題なくテストを通過しました。
最初にテストでエラーになったのと今回の違いは、以下の部分です。

Ruby

1microposts.yml 2<% 30.times do |n| %> 3micropost_<%= n %>: 4content: <%= Faker::Lorem.sentence(5) %> 5created_at: <%= 42.days.ago %> 6user: michael 7<% end %>

この部分を直書きしただけです。つまり、問題はこの部分にあると思っているのですが、どうにも解決策が見出だせません。。。

お手数ですが、どなたかご教授頂ければ幸いです。
(また、もし不足している情報などがあれば仰って頂けると助かります。)

###補足情報(言語/FW/ツール等のバージョンなど)
言語:Ruby on Rails

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

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

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

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

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

guest

回答1

0

ベストアンサー

YAMLではインデントが意味を持ちます。ですが、ご質問のコードを見るとインデントしてないので、ハッシュが1階層になってます。
以下チュートリアルからのコピペですが、content:, created_at:, user:の先頭に半角スペース2個を足してください。

YAML

1<% 30.times do |n| %> 2micropost_<%= n %>: 3 content: <%= Faker::Lorem.sentence(5) %> 4 created_at: <%= 42.days.ago %> 5 user: michael 6<% end %>

私もつい最近このチュートリアルをやりましたが、ちゃんと最後までできました。

投稿2016/06/27 16:28

guest1213

総合スコア306

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

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

gogoackman3

2016/06/27 16:33

ありがとうございました・・・!ずっと悩んでいたのですが・・・そういうことだったのですか。。。YAMLではインデントが意味を持つということはもう忘れることはないと思います。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問