RoR - NoMethodError,未定义的方法
RoR - NoMethodError, undefined method
我创建了一个带有简单登录验证的应用程序,它实际上是一个 Twitter 克隆。用户登录并访问页面等
但是当用户从那里的个人资料中发布内容时。它给出了一个错误
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
如果你们能提供帮助,我将不胜感激!
谢谢。
您正在尝试将 current_user.id
分配给 @ribbit.userid
,但未确保 current_user
已设置。 'current_user' 仅当之前保存过用户时才会设置。
因此,您需要确保经过身份验证的用户正在尝试创建 Ribbit
,或者如果您将 userid
视为非必填字段,则只需更改您的行5 来自:
@ribbit.userid = current_user.id unless current_user.blank?
如果您只希望经过身份验证的用户创建 Ribbit,请考虑使用 gem 来处理身份验证,例如 Devise。然后,您可以在控制器中使用 before_filter :authenticate_user!
来确保用户得到正确的身份验证。
我创建了一个带有简单登录验证的应用程序,它实际上是一个 Twitter 克隆。用户登录并访问页面等
但是当用户从那里的个人资料中发布内容时。它给出了一个错误
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
如果你们能提供帮助,我将不胜感激!
谢谢。
您正在尝试将 current_user.id
分配给 @ribbit.userid
,但未确保 current_user
已设置。 'current_user' 仅当之前保存过用户时才会设置。
因此,您需要确保经过身份验证的用户正在尝试创建 Ribbit
,或者如果您将 userid
视为非必填字段,则只需更改您的行5 来自:
@ribbit.userid = current_user.id unless current_user.blank?
如果您只希望经过身份验证的用户创建 Ribbit,请考虑使用 gem 来处理身份验证,例如 Devise。然后,您可以在控制器中使用 before_filter :authenticate_user!
来确保用户得到正确的身份验证。