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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1861閲覧

rails tutorial 13章の演習問題で疑問

ddd8

総合スコア19

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/08/28 12:15

編集2018/09/30 07:14

前提・実現したいこと

Rails Tutorial 13.3.2の演習問題を問いているところ、気になるところがありました。

演習問題は、パーシャルを利用してHOMEページをリファクタリングしろとのことで、以下のように記述したところ、アプリケーションは動くのですがunittestでエラーがでました。

テストのエラー

Error: MicropostsInterfaceTest#test_micropost_interface: ActionView::Template::Error: Missing partial microposts/_logged_in, application/_logged_in with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in: * "/home/ec2-user/environment/sample_app/app/views" app/views/static_pages/home.html.erb:2:in `_app_views_static_pages_home_html_erb___2443717471996564898_60904740' app/controllers/microposts_controller.rb:12:in `create' test/integration/microposts_interface_test.rb:16:in `block (2 levels) in <class:MicropostsInterfaceTest>' test/integration/microposts_interface_test.rb:15:in `block in <class:MicropostsInterfaceTest>'

なぜ、以下のコードでは正しくないのでしょうか。

該当のソースコード(HOMEページ)

<% if logged_in? %> <%= render 'logged_in' %> <% else %> <%= render 'without_logged_in' %> <% end %>

試しに、以下のように、フォルダー名から記述したところテストが正しく動きました。

試したこと

<% if logged_in? %> <%= render 'static_pages/logged_in' %> <% else %> <%= render 'static_pages/without_logged_in' %> <% end %>

補足情報(FW/ツールのバージョンなど)

HOMEページのファイルとlogged_in.html.erbやwithout_logged_in.html.erbファイルが置かれているフォルダーは同じなので、フォルダー名を省略しても動くだろうと思うのですが、なぜ正しく動かなかったのか疑問です。

###補足情報2
エラーメッセージを見ると
Missing partial microposts/_logged_in, application/_logged_in

とあることから、micropostsコントローラからrenderでstatic_pages/home.html.erbを表示しているのですが、その場合は、renderした元コントローラに対応するview内のパーシャルを探すようになっているのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ファイル名の先頭にアンダーバーがついてなかったのでは

  • _logged_in.html.erb
  • _without_logged_in.html.erb

追記:
Viewでrenderメソッドを使いパーシャルを呼び出した際のデフォルトの参照先についての質問だと推察します。

AコントローラのBアクションを実行して呼び出したビューテンプレート内で、

<%= render "hoge" %>

と書いてパーシャルを呼び出すと、views/A/_hoge.html.erbを検索します。

参考リンク

今回の場合、MicropostsControllerのcreateアクションからビューを呼び出していますので、
エラー文が示す通り、views/microposts/_logged_in.html.erbを検索します。

投稿2018/09/16 01:55

編集2018/10/02 01:48
troch

総合スコア349

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

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

ddd8

2018/09/30 06:57

ご回答ありがとうございます。 アンダーバーはついていました。 質問が漠然としていました。 具体的にはアプリケーション自体は動くのですが、テストでエラーがでました。
troch

2018/10/01 02:19 編集

すみません、ちゃんと書いてましたね…; 指摘ありがとうございます。 確認なのですが、「アプリケーションは動く」ということは、 <% if logged_in? %> <%= render 'logged_in' %> <% else %> <%= render 'without_logged_in' %> <% end %> というソースコードでも Railsアプリを起動⇒ブラウザからログイン⇒HOMEページの投稿欄から空データ(不正なデータ)を投稿⇒HOMEページに遷移 というを操作をした場合にパーシャルは正しく表示されるが、テストではエラーになる、ということでしょうか。 DaikiTsukaharaさんの書いたソースコード見てないので確かなことは分からないのですが、おそらく今回テストでエラーになった箇所ってmicroposts_interface_test.rbの # 無効な送信 assert_no_difference 'Micropost.count' do post microposts_path, params: { micropost: { content: "" } } end の箇所だと思うのですが… で、 app/controllers/microposts_controller.rb が class MicropostsController < ApplicationController before_action :logged_in_user, only: [:create, :destroy] def create @micropost = current_user.microposts.build(micropost_params) if @micropost.save flash[:success] = "Micropost created!" redirect_to root_url else render 'static_pages/home' end end っていう風になってると思うので、 要するに空データを投稿した場合、バリデーションに引っかかって'static_pages/home'に飛ばされるから、投稿する前後でユーザの投稿数は変わらないよね、ってのを確認するためのテストだと思うので、これでstatic_pages/home.html.erbを表示した際にMissing partialのエラーになるなら、実際にブラウザで動かした場合もエラーになるんじゃないかと思うのですが… それとも「アプリケーションは動く」というのは、ブラウザからHOMEページを表示するだけならエラーにならない、という趣旨でしょうか??
ddd8

2018/10/04 12:50 編集

度々のご解答ありがとうございます。 ご指摘の通り、「アプリケーションは動く」はブラウザからHOMEページを表示するだけならエラーにならないという趣旨で使いました。 誤解を招く書き方をしてしまいました。 trochさんのおかげで、モヤモヤが解決しました。 こんな拙い質問から求める回答を導き出していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問