在尝试通过id访问用户时,我收到此错误“未定义的方法`名称'为nil:NilClass”

时间:2016-04-05 20:26:29

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 rubygems

我是rails的新手,我之前已尝试过stackoverflow上可用的所有解决方案。我正在尝试使用localhost:3000 / users / 1通过id访问用户。我的user_controller代码是:

 class UsersController < ApplicationController
      def new
       @user=User.new
      end
      def index
       @users = User.all
      end
      def create
       @user = User.new(user_params)
      if @user.save
        redirect_to @user
      else
        @title = "Sign up"
        render 'new'
      end
    end
    private
    def user_params
      params.require(:user).permit(:password, :password_confirmation,:email)
    end
    def show
       @user = @users.find(params[:id])
       @users=User.all
    end
  end

And my show.html.erb contains :
    <% provide(:title, @users.name ) %> 
    <div class="row">
    <aside class="span4">
    <section>
    <h1>
    <%= gravatar_for @user %>
    <%= @users.name  %>
    </h1>
    </section>
    </aside>
    </div>

1 个答案:

答案 0 :(得分:2)

  1. show中取出private个动作。它不是私人方法。这就是变量@users为零的原因。但是,您甚至不需要找到@users,下面的答案显示了这一点。
  2. 您正尝试在数组name上调用方法@users(属性)。您需要在对象@user上调用它。
  3. 旁注:在Rails中还有一个预定义的方法name,用于ActiveRecord :: Relation(User.all)。但是,在您发布的示例中,您的变量@users为零,所以它没有达到这个目的。 但是,如果您的show操作不是私有方法,您可能会遇到这种情况:

    $ User.all.name # or @users.name
    # => 'User'
    
    $ Post.all.name
    # => 'Post'
    
    $ User.first.name # or @user.name
    # => 'John'
    

    <强>解决方案

    # show.html.erb
    <%= @user.name %>
    
    # users_controller
    class UsersController < ApplicationController
      def index
        @users = User.all
      end
    
      def new
       @user = User.new
      end
    
      def show
        @user = User.find(params[:id])
      end
    
      def create
        @user = User.new(user_params)
        if @user.save
          redirect_to @user
        else
          @title = "Sign up"
          render 'new'
        end
      end
    
      private
    
      def user_params
        params.require(:user).permit(:password, :password_confirmation, :email)
      end 
    end