2013-07-23 13 views
8

Tôi đang theo hướng dẫn Rails của Michael Hartl (chương 9). Khi tôi cố gắng truy cập vào các trang tương ứng với profile của người dùng, trình duyệt sẽ hiển thị các thông báo lỗi sau:before_action trong lỗi kết xuất bộ điều khiển người dùng: NoMethodError trong Người dùng # hiển thị

NoMethodError in Users#show 

Showing /home/jonathan/Desktop/railsTut/sample_app/app/views/users/show.html.erb where line #1 raised: 

undefined method `name' for nil:NilClass 

Extracted source (around line #1): 

1: <% provide(:title, @user.name) %> 
2: <div class="row"> 
3: <aside class="span4"> 
4:  <section> 

Rails.root: /home/jonathan/Desktop/railsTut/sample_app 

Đây là users_controller.rb tôi

class UsersController < ApplicationController 
    before_action :signed_in_user, only: [:edit, :update] 

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

    def new 
    @user = User.new 
    end 

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

    def edit 
    @user = User.find(params[:id]) 
    end 

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

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

private 

    def user_params 
    params.require(:user).permit(:name, :email, :password, :password_confirmation) 
    end 


    # Before filters 

    def signed_in_user 
    unless signed_in? 
     store_location 
     redirect_to signin_url, notice: "Please sign in." 
    end 
end 
end 

Các tải trang tốt mà không có dòng:

before_action :signed_in_user, only: [:edit, :update] 

Nhưng với những điều bao gồm mọi thứ xảy ra sai và tôi không thể hiểu tại sao.

Ngoài ra, đây là routes.rb

SampleApp::Application.routes.draw do 
    resources :users 
    resources :sessions, only: [:new, :create, :destroy] 

    root to: 'static_pages#home' 

match '/signup', to: 'users#new' 
    match '/signin', to: 'sessions#new' 
    match '/signout', to: 'sessions#destroy', via: :delete 

    match '/help', to: 'static_pages#help' 
    match '/about', to: 'static_pages#about' 
    match '/contact', to: 'static_pages#contact' 

end 

Any help is appreciated!

+0

tệp tuyến đường và url là gì khi bạn truy cập trang này. – rmagnum2002

+0

có nghĩa là bạn sẽ nhận được người dùng trong hồ sơ của người dùng. – Debadatt

+0

Tôi vừa thêm tệp tuyến đường vào bài đăng gốc. Url là http: // localhost: 3000/users/1 –

Trả lời

17

Thay vì Trước khi hành động trong Users_controller thử trước khi lọc Vì vậy, mã của bạn trông như thế này:

before_filter :signed_in_user, only: [:edit, :update] 

Tôi đã có những lỗi chính xác cùng!

1

Tiếp tục câu trả lời @Hurman Gul, tôi hy vọng sẽ cung cấp cho bạn một số chi tiết về lý do tại sao bạn nhìn thấy vấn đề này ...


điều khiển của bạn hoạt động một hành động On A không tồn tại Variable

các lỗi mà bạn có là bởi vì một trong những hành động của bạn đang cố gắng để thực hiện một hành động trên một biến được hoặc không được đặt hoặc không có nội dung (là nil). Lỗi cơ bản có nghĩa là bạn đang cố gọi phần ".name" của một biến, trong đó nó không tồn tại

undefined method `name' for nil:NilClass 

Extracted source (around line #1): 

1: <% provide(:title, @user.name) %> 
2: <div class="row"> 
3: <aside class="span4"> 
4:  <section> 

Rails.root: /home/jonathan/Desktop/railsTut/sample_app 

Điều này về cơ bản có nghĩa là bạn đang cố tải @user .name, khi @user có thể không tồn tại. Con đường tôi muốn khuyên bạn nên sửa chữa này là bước đầu áp dụng một số logic để xem của bạn:

#app/views/users/show.html.erb 
<% unless defined?(@user) %> 
    Sorry, we could not find your user! 
<% else %> 

your code 

<% end %> 
1

tôi đã cùng một vấn đề sử dụng 4.1.6. Vấn đề là bạn đã xác định before_action là private, tôi không biết tại sao nhưng loại hiển thị này gây rối với tải trước before_action của bộ điều khiển trong Rails. Vì vậy, chỉ cần mang lại signed_in_user bên ngoài khu vực đó và nó sẽ bắt đầu hoạt động trở lại.

Hy vọng điều này sẽ hữu ích!