1

私はMichaelHartlによるRailsチュートリアルに従っています。実際にはすでに終了していますが、最終章の最後の演習で行ったリファクタリングで問題が発生しています。私がしたのは、ユーザーモデル(show.html.erb)の表示ビューを次のように変更することだけでした。

<section>
  <h1>
    <%= gravatar_for @user %>
    <%= @user.name %>
  </h1>
</section>

これに:

<section>      
   <%= render 'shared/user_info' %>
</section>

そしてpartial(_user_info.html.erb)に私はこれを持っています:

<a href="<%= user_path(current_user) %>">
   <%= gravatar_for current_user, size: 52 %> 
</a> 
<h1> <%= current_user.name %> </h1> 
<% unless current_page?(user_path(current_user)) %> 
   <span> <%= link_to "view my profile", current_user %> </span>
   <span> <%= pluralize(current_user.microposts.count, "micropost") %> </span>
<% end %>

ブラウザではすべて正常に動作しますが、何らかの理由でrspecが一部のテストに失敗しているため、sessions_helper.rbで定義されているcurrent_userメソッドの呼び出しに問題があると思われます。これはapplication_helper.rbに含まれています。gravatar_for関数はusers_helper.rbで定義されています。これが私がテストから得たエラーです:

失敗/エラー:前{visit user_path(user)} ActionView :: Template :: Error:undefined method gravatar_for'#./app/views/shared/_user_info.html.erb:1: email' for nil:NilClass # ./app/helpers/users_helper.rb:4:inin _app_views_users_show_html_erb___ _app_views_shared__user_info_html_erb___3480157814439046731_47327400' # ./app/views/users/show.html.erb:5:in1252254778347368838_47378900'#./spec/requests /user_pages_spec.rb:58:in `ブロック(3レベル)in'

ここで何が起こっているのかを特定するのを手伝っていただければ幸いです。同じことをするためのさまざまな方法を見つけることができましたが、私はこれについて非常に興味があります。私はRailsの経験があまりないので、チュートリアルに従ったので、明らかな何かが欠けている場合はご容赦ください。ありがとう。

4

3 に答える 3

3

私は解決策を得たと思います。私はまだ混乱していますが。これが私の質問で言及されたリファクタリング前のテストのコードです(チュートリアルにあるように、それらはすべて合格していました):

describe "profile page" do
  let(:user) { FactoryGirl.create(:user) }
  let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
  let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }

  before { visit user_path(user) }

  it { should have_selector('h1',    text: user.name) }
  it { should have_selector('title', text: user.name) }

  describe "microposts" do
    it { should have_content(m1.content) }
    it { should have_content(m2.content) }
    it { should have_content(user.microposts.count) }
  end #some other tests for show page continue, also having the same behaviour
end

テストを読んで間違いがないかどうかを確認しているときに、ユーザーにサインインしていないのになぜこれらのテストに合格するのか疑問に思い始めたので、次のように、beforeブロックでユーザーにサインインするコードを追加しました。

describe "profile page" do
  let(:user) { FactoryGirl.create(:user) }
  let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
  let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }

  before do
    valid_signin user
    visit user_path(user) 
  end

  it { should have_selector('h1',    text: user.name) }
  it { should have_selector('title', text: user.name) }

  describe "microposts" do
    it { should have_content(m1.content) }
    it { should have_content(m2.content) }
    it { should have_content(user.microposts.count) }
  end #some other tests for show page continue, also having the same behaviour
end

そして今、すべてのテストに合格しています。ユーザーにサインインするのはばかげて明白に思えますが、それがチュートリアルのテストであり、以前は機能していた方法です。確認したい場合は、更新されたテストファイルを次に示します。すべての変更が私のgithubリポジトリにコミットされました。よろしくお願いします。

于 2012-07-12T03:26:00.637 に答える
2

リポジトリをざっと見てみると、これが問題である可能性があります。6月25日にRailsチュートリアルで、 app / helpers/sessions_helper.rbファイルcurrent_usersign_insign_outメソッドの設定に関して小さなバグが報告されました。通知はRailsチュートリアルニュースサイトに投稿されていないようですが、購読者に送信され、現在のオンラインブックに次のように変更するように反映されています。

self.current_user = user   # in the sign_in method
self.current_user = nil    # in the sign_out method

だから、を更新しsessions_helper.rbみて、それがユーザーを取得するのを妨げるかどうかを確認してくださいnil

于 2012-07-11T15:35:20.713 に答える
1

テストデータベースにユーザーがいないようです。開発データベースとテストデータベースは2つの異なるものです。Rspecは、テストの実行時にテストデータベースを使用します。

テストデータベースを設定するには、次のようにしますrake db:test:prepare

次に、仕様を実行するときにテストデータベースにデータを入力する必要があります。そのための優れた方法の1つは、ファクトリーガールの宝石を使用することです。

于 2012-07-11T11:26:59.553 に答える