2015-04-03 4 views
2

Я искал все и не могу найти ответ на это в любом месте.NoMethodError Rails 3.2

Я принимаю вступительное слово к курсу RoR на удемии, и я смог решить все проблемы, которые у меня были в первых 80% курса, но теперь я на контрольно-пропускном пункте и могу Не находите этого. Мы создаем приложение, такое как Etsy, и я нахожусь в точке, где мне нужно ограничить пользователей от редактирования/удаления списков, которые им не принадлежат.

Я бегу Руби 1.9.3 на Rails 3.2.21

Я попытался, следуя инструкциям для добавления фильтра пользователя проверки, но когда я проверил назад на локальном хосте, я получил эту ошибку:

NoMethodError in ListingsController#edit

undefined method `user' for nil:NilClass

app/controllers/listings_controller.rb:98:in `check_user'

Parameters: {"id"=>"8"}

Мой код соответствует коду инструкторов точно, но я думаю, что это ошибка, потому что я использую Rails 3, и он использует 4.

Вот мой listings_controller.rb

class ListingsController < ApplicationController 
    # GET /listings 
    # GET /listings.json 
    before_filter :authenticate_user!, only: [:new, :create, :edit, :update, :destroy] 
    before_filter :check_user, only: [:edit, :update, :destroy] 

    def index 
    @listings = Listing.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @listings } 
    end 
    end 

    # GET /listings/1 
    # GET /listings/1.json 
    def show 
    @listing = Listing.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @listing } 
    end 
    end 

    # GET /listings/new 
    # GET /listings/new.json 
    def new 
    @listing = Listing.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @listing } 
    end 
    end 

    # GET /listings/1/edit 
    def edit 
    @listing = Listing.find(params[:id]) 
    end 

    # POST /listings 
    # POST /listings.json 
    def create 
    @listing = Listing.new(params[:listing]) 
    @listing.user_id = current_user.id 

    respond_to do |format| 
     if @listing.save 
     format.html { redirect_to @listing, notice: 'Listing was successfully created.' } 
     format.json { render json: @listing, status: :created, location: @listing } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @listing.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /listings/1 
    # PUT /listings/1.json 
    def update 
    @listing = Listing.find(params[:id]) 

    respond_to do |format| 
     if @listing.update_attributes(params[:listing]) 
     format.html { redirect_to @listing, notice: 'Listing was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @listing.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /listings/1 
    # DELETE /listings/1.json 
    def destroy 
    @listing = Listing.find(params[:id]) 
    @listing.destroy 

    respond_to do |format| 
     format.html { redirect_to listings_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    def set_listing 
    @listing = Listing.find(params[:id]) 
    end 

    def listing_params 
    params.require(:listing).permit(:name, :description, :price, :image) 
    end 

    def check_user 
    if current_user != @listing.user 
     redirect_to root_url, alert: "Sorry, this listing belongs to someone else." 
    end 
    end 

end 

код, который мы должны были добавить в это второй before_filter и Защиту check_user

Если какая-либо другая информация необходима, чтобы помочь ответить на этот вопрос, пожалуйста, дайте мне знать.

ответ

0

Это не ошибка Rails 3 против 4, ваш код никогда не вызывает set_listing, и поэтому @listing никогда не устанавливается. Вы, вероятно, следует иметь:

before_filter :set_listing, only: [:show, :edit, :update, :destroy] 

в верхней части файла, перед before_filter :check_user, ...

+1

Спасибо так много! Я работаю над тем, чтобы понять это навсегда. По какой-то причине код инструктора автоматически называется 'set_listing', поэтому я не знал, что мне нужно ввести его в свой код. Я помечаю ваш ответ как принятый через несколько минут, как только StackOverflow разрешит. –

+0

Добро пожаловать. – smathy