Я искал все и не могу найти ответ на это в любом месте.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
Если какая-либо другая информация необходима, чтобы помочь ответить на этот вопрос, пожалуйста, дайте мне знать.
Спасибо так много! Я работаю над тем, чтобы понять это навсегда. По какой-то причине код инструктора автоматически называется 'set_listing', поэтому я не знал, что мне нужно ввести его в свой код. Я помечаю ваш ответ как принятый через несколько минут, как только StackOverflow разрешит. –
Добро пожаловать. – smathy