2015-04-21 3 views
-2

Я создал приложение с простой аутентификацией входа, это на самом деле твитер-клон. Пользователь регистрируется и получает доступ к страницам и т. Д.RoR - NoMethodError, undefined method

Но когда пользователь публикует что-то из этого профиля. Это дает ошибку

NoMethodError in RibbitsController#create 
undefined method `id=' for nil:NilClass 

Ошибка вокруг линии 5:

class RibbitsController < ApplicationController 

def create 
    @ribbit = Ribbit.create(user_ribbits) 
    @ribbit.userid = current_user.id 

    if @ribbit.save 
     redirect_to current_user 
    else 
     flash[:error] = "Problem!" 
     redirect_to current_user 
    end 
end 

private 

def user_ribbits 
     params.require(:ribbit).permit(:content, :userid) 
    end 
end 

Запрос дано приложение:

Request 

Параметры:

{"utf8"=>"✓", 
"authenticity_token"=>"dwVmjDNO4GOowphGFgChMDBxBfvka+M/xSUHvJMECzwxtv4NF6OuWtiaX74NLz91OwQJ9T9+wm7yMiPQ0BLpGA==", 
"ribbit"=>{"content"=>"hi. test.\r\n"}, 
"commit"=>"Ribbit!"} 

сессий контроллер :

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    user = User.find_by_username(params[:username]) 
    if user && user.authenticate(params[:password]) 
     session[:userid] = user.id 
     redirect_to rooturl, notice: "Logged in!" 
    else 
     flash[:error] = "Wrong Username or Password." 
     redirect_to root_url 
    end 
    end 

    def destroy 
    session[:userid] = nil 
    redirect_to root_url, notice: "Logged out." 
    end 

end 

пользователям контроллер:

class UsersController < ApplicationController 

def new 
    @user = User.new 
end 

def create 
    @user = User.create(user_params) 

    if @user.save 
    session[:user_id] = @user.id 
    redirect_to @user, notice: "Thank you for signing up!" 
    else 
    render 'new' 
    end 
end 

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

private 

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

end 

И применение контроллера

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 

    private 

def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

    helper_method :current_user 
end 

Я был бы очень признателен, если бы вы, ребята бы помочь!

Спасибо.

+0

Вы уверены, что ваш «Ribbit» является существом, спасенным? –

+0

не уверен, что это причина, но вы используете как ': userid', так и': user_id'. вероятно, захотите придерживаться 'user_id', потому что традиционно использовать это имя внешнего ключа – lobanovadik

+0

попробуйте разместить отладчик в действии' create' 'RibbitsContoller' и посмотреть, получаете ли вы' current_user' – Deep

ответ

1

Вы пытаетесь назначить current_user.id на номер @ribbit.userid, не гарантируя, что установлен current_user. «current_user» будет установлен только в том случае, если ранее пользователь был ранее сохранен.

Таким образом, вам нужно либо убедиться, что авторизованный пользователь пытается создать Ribbit, или если рассматривать userid как, не обязательное поле, вы можете просто изменить строку 5 по:

@ribbit.userid = current_user.id unless current_user.blank? 

Если вы хотите, чтобы аутентифицированный пользователь создавал Ribbits, тогда подумайте об использовании драгоценного камня для обработки аутентификации, такой как Devise. Затем вы можете использовать before_filter :authenticate_user! в своем контроллере, чтобы убедиться, что пользователи прошли проверку подлинности.

Смежные вопросы