2013-07-23 4 views
8

Я следую руководству Rails Майкла Хартла (глава 9). При попытке открыть страницу соответствующего профиля на пользователя, браузер отображает следующие сообщения об ошибках:before_action в ошибке воспроизведения пользовательского контроллера: NoMethodError in Users # show

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 

Вот мой users_controller.rb

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 

страница загружается нормально без линии:

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

Но с его включением все идет не так, и я не могу понять, почему.

Кроме того, здесь 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 

Любая помощь приветствуется!

+0

Путь к файлу, пожалуйста, и что такое URL-адрес при доступе к этой странице. – rmagnum2002

+0

, что означает, что пользователь получает нулевого пользователя в профиле пользователя. – Debadatt

+0

Я только что добавил файл маршрутов в исходное сообщение. URL-адрес http: // localhost: 3000/users/1 –

ответ

17

Вместо До действий в Users_controller попробовать перед фильтром Таким образом, ваш код выглядит следующим образом:

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

Я имел точно такую ​​же ошибку!

17

Если решение Hurman решило вашу проблему, причина в том, что вы используете более старую версию (то есть < 4.0.0) рельсов. before_filter был переименован в этой версии к before_action (https://github.com/rails/rails/commit/9d62e04838f01f5589fa50b0baa480d60c815e2c), подробная информация в Rails 4: before_filter vs. before_action

1

В дополнение к ответу @Hurman Гюля, я надеюсь, даст вам некоторые подробности о том, почему вы видите эту проблему ...


Ваш контроллер выполняет действие на несуществующий переменный

ошибки у вас есть, потому что один из ваших действий пытаются выполнить действие на переменном, которая либо не установлена, либо не имеет никакого содержания(nil). Ошибка в основном означает, что вы пытаетесь назвать «.name» часть переменной, где не существует

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 

В основном это означает, что на ваш взгляд, вы пытаетесь загрузить @user .name, когда @user, вероятно, не существует. Так я бы рекомендовал фиксируя это сначала применить некоторую логику к вашему мнению:

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

your code 

<% end %> 
1

Я имел такую ​​же проблему, используя 4.1.6. Проблема в том, что вы определили before_action как private, я не знаю, почему, но этот тип видимости беспорядочен с загрузкой контроллера before_action в Rails. Так что просто принесите signed_in_user за пределы этого района, и он должен снова начать работать.

Надеюсь, это поможет!