1

私はHartl のチュートリアルの第 11 章non-logged-in users in the Users controller visiting the followers and following pageに取り組んでおり、合格を目指しています。パーシャルadmin?でのみ使用されているにもかかわらず、Rails が未定義のメソッドについて不平を言うというエラーが発生しています。User

Railsローカルサーバー

Rendered users/_user.html.erb (9.4ms)
Rendered users/show_follow.html.erb within layouts/application (33.0ms)
Completed 500 Internal Server Error in 43ms

ActionView::Template::Error (undefined method `admin?' for nil:NilClass):
    1: <li>
    2:   <%= gravatar_for user, size: 52 %>
    3:   <%= link_to user.name, user %>
    4:   <% if current_user.admin? && !current_user?(user) %>
    5:     | <%= link_to 'delete', user, method: :delete,
    6:                                   data: { confirm: 'Are you sure?' } %>
    7:   <% end %>
  app/views/users/_user.html.erb:4:in `_app_views_users__user_html_erb___4000670281664801561_70099451578240'
  app/views/users/show_follow.html.erb:25:in `_app_views_users_show_follow_html_erb__2024448610717183111_70099484108000'
  app/controllers/users_controller.rb:68:in `followers'

RSpec の失敗

 1) Authentication authorization for non-logged-in users in the Users controller visiting the following page
     Failure/Error: it { should have_selector('title', text: 'Login') }
       expected css "title" with text "Login" to return something
     # ./spec/requests/authentication_pages_spec.rb:122:in `block (6 levels) in <top (required)>'

  2) Authentication authorization for non-logged-in users in the Users controller visiting the followers page
     Failure/Error: it { should have_selector('title', text: 'Login') }
       expected css "title" with text "Login" to return something
     # ./spec/requests/authentication_pages_spec.rb:127:in `block (6 levels) in <top (required)>'

authentication_pages_spec.rb

  describe "authorization" do
    .
    .
    .
    describe "for non-logged-in users" do
      let(:user) { FactoryGirl.create(:user) }
      .
      .
      .
      describe "in the Users controller" do
        .
        .
        .
        describe "visiting the following page" do
          before { visit following_user_path(user) }
          it { should have_selector('title', text: 'Login') }
        end

        describe "visiting the followers page" do
          before { visit followers_user_path(user) }
          it { should have_selector('title', text: 'Login') }
        end
      end

show_follow.html.erb

<% provide(:title, @title) %>
<div class="row">
  <aside class="span4">
    <section>
      <%= gravatar_for @user %>
      <h1><%= @user.name %></h1>
      <span><%= link_to "view my profile", @user %></span>
      <span><b>Posts:</b> <%= @user.posts.count %></span>
    </section>
    <section>
      <%= render 'shared/stats' %>
      <% if @users.any? %>
        <div class="user_avatars">
          <% @users.each do |user| %>
            <%= link_to gravatar_for(user, size: 30), user %>
          <% end %>
        </div>
      <% end %>
    </section>
  </aside>
  <div class="span8">
    <h3><%= @title %></h3>
    <% if @users.any? %>
      <ul class="users">
        <%= render @users %>
      </ul>
      <%= will_paginate %>
    <% end %>
  </div>
</div>

_user.html.erb

<li>
  <%= gravatar_for user, size: 52 %>
  <%= link_to user.name, user %>
  <% if current_user.admin? && !current_user?(user) %>
    | <%= link_to 'delete', user, method: :delete, 
                                  data: { confirm: 'Are you sure?' } %>
  <% end %>
</li>

チュートリアル自体から問題のあるファイルをすべてコピーして貼り付けようとしましたが、役に立ちませんでした。:admin属性をUserクラスに割り当てることにより、メソッドadmin?を使用できるようになると述べられています。どういうわけかnilオブジェクトをパーシャルに渡していると思いますが、正確にそれが起こっている場所をデバッグするのに問題があります。

4

4 に答える 4

2

あなたのコードはcurrent_user.admin?、それに基づいて表示されるものをチェックして変更しています。ただし、仕様のタイトルから、ログインしていないユーザーがページにアクセスしたときの動作をテストしているように見えます: current_user は nil になります

_user パーシャルの if ステートメントには、そのユーザーが管理者であることを確認する前に、ログインしているユーザーが存在することを確認する追加の条件が必要なようです。

于 2013-04-08T08:57:00.253 に答える
1

また、User コントローラーの :logged_in_user の before_filter に :following および :followers アクションを入れるのを忘れていましたが、このエラーが気になりました。

Frederick Cheung が指摘するように、パーシャルのコードにバグがあります: _user.html.erb。管理者を呼び出す前に current_user が nil かどうかを確認する必要がありますか? その上で方法。

したがって、代わりに:

 <% if current_user.admin? && !current_user?(user) %>

あなたが持っている必要があります:

 <% if current_user && current_user.admin? && !current_user?(user) %>

これにより、「未定義のメソッド admin?」が削除されます。エラーであり、正しいテスト エラーが返されます。

 Expected response to be a <redirect>, but was <200>

この最後のものは、:logged_in_user の before_filter に :following および :followers アクションを入れることで削除します。

于 2014-12-29T17:34:57.540 に答える
1

を調べてみてくださいusers_controller。パーシャルのコードは問題ないように見えます。つまり、舞台裏で何かが欠けている可能性があります。ローカル サーバー トレースは、68 行目とフォロワー メソッドを指しているようです。私はこのように見えます、fyi:

def followers 
   @title = "Followers"
   @user = User.find(params[:id])
   @users = @user.followers.paginate(page: params[:page])
   render 'show_follow'
end 

それが役立つことを願っています。

于 2013-04-08T09:12:10.037 に答える