1

私は他の多くのスレッドを見て、過去数時間かけて調べましたが、まだ理解できていません.

別のビュー ページから同じコード行を使用しています

エラーは次のとおりです。

app/views/users/_user.html.erb行#4が発生した場所:

undefined method `microposts' for nil:NilClass

これは、Rubytutorial デモ アプリからのものです。このコードはで使用されviews\users\show.html.erb、動作するかどうかを確認しようとしましviews\users\ _user.html.erbたが、エラーが発生しました。

私が再利用しているコードは次のとおりです。

<%= @user.microposts.count %>

これは、パーシャルを呼び出す完全なビュー (_user.html.erb) です。

<li>
  <%= gravatar_for user, size: 52 %>
  <%= link_to user.name, user %>
<%- if @user %>
  <%= @user.microposts.count %>
<%- else %>
  THIS IS THE ERROR, THERE IS NO USER ON @user
<%- end %>
 <% if current_user.admin? && !current_user?(user) %>
    | <%= link_to "delete", user, method: :delete, confirm: "You sure?" %>
  <% end %>
</li>

その結果、これはエラーです。\@user にはユーザーがありません。これは、rorra のコメントによると、部分的に \@user が存在しないことを意味するので、どこで修正すればよいでしょうか?

class UsersController < ApplicationController
  before_filter :signed_in_user,
                only: [:index, :edit, :update, :destroy, :following, :followers]
  before_filter :correct_user,   only: [:edit, :update]
  before_filter :admin_user,     only: :destroy


  def index

    @users = User.paginate(page: params[:page])
  end


  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
  end



  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to Sample App!"
      redirect_to root_url
    else
      render 'new'
    end
  end

  def edit
  end

  def update
    if @user.update_attributes(params[:user])
      sign_in @user
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User destroyed"
    redirect_to users_path
  end


  private

    def correct_user
      @user = User.find(params[:id])
      redirect_to root_path unless current_user?(@user)
    end

    def admin_user
      redirect_to root_path unless current_user.admin?
    end
end

これがviews\users\index.html.erbです

<% provide(:title, 'Users') %>
<h1>Users</h1>

<%= will_paginate %>

<ul class="users">
  <%= render @users %>

</ul>

<%= will_paginate %>

そして、これがviews\users\show.html.erbです

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="span4">
    <section>
      <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
      </h1>
    </section>
    <section>
      <%= render 'shared/stats' %>

    </section>
  <br>
  </aside>


  <div class="span10">
    <%= render 'follow_form' if signed_in? %>
    <% if @user.microposts.empty? %>
<h3>Microposts (<%= @user.microposts.count %>)</h3>
<% end %>
    <% if @user.microposts.any? %>
      <h3>Microposts (<%= @user.microposts.count %>)</h3>
      <ol class="microposts">
        <%= render @microposts %>
      </ol>

      <%= will_paginate @microposts %>
    <% end %>
  </div>
</div>
4

1 に答える 1

0

パーシャル(\ views \ users \ _user.html.erb)を次のコードで更新します。

<%- if @user %>
  <%= @user.microposts.count %>
<%- else %>
  THIS IS THE ERROR, THERE IS NO USER ON @user
<%- end %>

そしてあなたは最後のフレーズを得るでしょう:P

問題は、パーシャルの@userが、Userオブジェクトではなく、nilオブジェクトであるということです。

showアクションからパーシャルを呼び出す場合は、nilオブジェクトを使用しないでください。@ userがnilの場合、アクションの2行目に例外がスローされます(パーシャルには到達しません)。

さて、新しい開発者にとって紛らわしいのは、パーシャルでは通常、パーシャルの名前であるオブジェクトを渡すことです。したがって、この場合のように、パーシャルの名前が_userの場合、デフォルトを渡します。このパーシャルにオブジェクトを追加すると、インスタンス変数@userの代わりに変数userを使用してオブジェクトを参照できるようになります。

あなたの見解でもこのコードを試してください:

<%= user.microposts.count %>

それを機能させるために、あなたは通常次のようなオブジェクトを送信します

<%= render partial: '/views/users/user', object: @my_user %>

あるいは

<%= render @user %> 

ビュー_user.html.erbを検索します

通常、これらのパーシャルを使用して、次のようなコレクションをレンダリングします。

<%= render partial: '/views/users/user', collection: @users %>

詳細については、パーシャルに関するRailsガイドをお読みください。


パーシャルは次のようになります。

    <li>
      <%= gravatar_for user, size: 52 %>
      <%= link_to user.name, user %>
      <%= user.microposts.count %>
      <% if current_user.admin? && !current_user?(user) %>
        | <%= link_to "delete", user, method: :delete, confirm: "You sure?" %>
      <% end %>
    </li>

index.html.erbからパーシャルを呼び出す方法

<%= render @users %>

その完全に素晴らしい

改ページにどの宝石を使用していますか?問題は、 paginateが各ユーザーの配列ではなくActiveRecordリレーションを返すことだと思います。

コントローラのインデックスアクションを次のように更新します。

@users = User.paginate(page: params[:page]).all
于 2013-03-04T08:07:08.903 に答える