2013-05-02 76 views
0

我是编程新手,我正在通过rails的方式工作。我试图建立一个小应用程序,但我很困惑这个问题。我一直在调整Michael Hartl教程来构建应用程序,但我想我错过了一些东西。Rails呈现部分 - 继续获取未定义的方法无:NilClass

下面我已经分解了代码的相关部分(希望),并且希望能够帮助我们找出问题所在。

错误是:

未定义的方法`用户名”的零:NilClass

这可能是尝试显示的寄存器形式的局部上时前指出,我得到一个类似的错误有用主页。这是固定的:

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

做这次同样的事情不会删除错误,但我仿佛在签订,但不会让我登出或与任何的功能交互的应用程序的行为。

我已经试过上述的各种变化,包括:@current_user => CURRENT_USER等

有人能解释我做错了,因为它似乎,我不是做正确的事情!

谢谢。

users控制器

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 

SESSIONS CONTROLLER

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> ROOT TO HOME

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

PARTIAL IN A /共享文件夹

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

回答

0

您的部分要显示的数据仅在用户与账户拥有。然而,当用户进入你的主页,没有CURRENT_USER对象,因为他不是在签署喷气你可以附上您呈现:像这样的东西部分呼叫:

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

只有当它显示用户信息,他已登录。

+0

转发您的答案我相信在技术上意味着,当他处于UserController的索引操作中时,他一定想要这样:'@user = current_user'这意味着当'index'行为被渲染后会得到current_user。他的问题是[:username]是零,他试图从一个零对象检索id键的值。 – David 2013-05-02 00:47:11

+0

我不完全确定你在说什么。我对他的问题的解释是,他在他的偏好的第一行得到了例外,因为current_user是零,因为他的cookies中没有remember_token。我不确定这是正确的解释,但我也看不到涉及UsersController#索引。 – 2013-05-02 01:02:53

+0

丹尼尔你是对的。非常感谢!这确实揭示了一些事情,但问题依然存在。我应该如何呈现部分? – JimmyBob 2013-05-02 01:12:15

相关问题