Rails渲染部分 - 继续获取未定义的方法nil:NilClass

时间:2013-05-02 00:22:38

标签: ruby-on-rails render partial

我是编程新手,我正在通过rails工作。我正在尝试构建小型应用程序,但我对这个问题非常沮丧。我一直在修改Michael Hartl教程来构建应用程序,但我想我错过了一些东西。

下面我已经分解了代码的相关部分(希望如此),我希望能帮助解决问题所在。

错误是:

nil的未定义方法`username':NilClass

在尝试在主页上显示注册表单部分之前,指出我遇到类似错误可能会有用。这修复了:

<%= render :partial => 'users/new', :locals => { :user => @user ||= User.new } %>

在这种情况下做同样的事情会删除错误,但应用程序的行为就好像我已登录但不允许我注销或与任何功能交互。

我尝试了以上各种变体,包括:@current_user =&gt; current_user等

有人可以解释我做错了什么,因为看起来我做的不对!

感谢。

USERS CONTROLLER

class UsersController < ApplicationController

  before_filter :signed_in_user,  only: [:show]
  before_filter :correct_user,    only: [:show]
  before_filter :admin_user,      only: [:index, :destroy]     

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

  end

  def show
    @user = User.includes(:video_posts).find(params[:id])
    @video_posts = @user.video_posts.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 the Sample App!"
      redirect_to @user
    else
      render :template => 'static_pages/home'
    end
  end

VIDEOPOST CONTROLLER

class VideoPostsController < ApplicationController

  before_filter :signed_in_user

  def create

  end

  def destroy

  end


end

会话控制器

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = "Invalid email/password combination"
      render 'new'
    end
  end

  def destroy
    sign_out
    redirect_to root_path
  end

end

SESSIONS HELPER

module SessionsHelper
 def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

  def current_user?(user)
    user == current_user
  end
end

STATICPAGES&gt; ROOT TO HOME

<%= render :partial => 'shared/user_info', :locals => { :current_user => current_user } %>

A / SHED FOLDER中的部分

<h2><%= current_user.username %></h2>
<span><%= link_to "view profile", current_user %></span>
<span><%= pluralize(current_user.video_posts.count, "video_post") %></span>

1 个答案:

答案 0 :(得分:0)

您的部分想要仅显示具有帐户的用户的数据。但是,当用户进入您的主页时,没有current_user对象,因为他没有使用jet签名。您可以使用以下内容附加您的render:partial调用:

<% if current_user %>
  <%= render :partial ... %>
<% else %>
  <h1>Welcome</h1>
<% end %>

仅在用户登录时显示用户信息。