在 application.rb 中定义的 current_user 在创建操作中不起作用
current_user defined in application.rb will not work in create action
这是我的 application_controller.rb
private
def current_user
return unless session[:user_id]
@current_user ||= User.find_by_id(session[:user_id])
end
helper_method :current_user
这是我 comments_controller.rb
的创建方法
def create
@user = User.find(params[:user_id])
@user.comments.create(:user_id => @user.id, :commenter => current_user.login, :body => params[:comment][:body])
respond_to do |format|
format.js
format.html { redirect_to(@user, :notice => 'Comment was successfully created.') }
end
end
调用时显示:
nil:NilClass
的未定义方法“登录”
什么可以阻止 current_user 被发现?
current_user
被正确找到。如果没有,就会有 NoMethodError
.
在你的例子中 current_user
只是返回 nil
。然后您尝试在 nil
上使用 .login
,这会导致您看到错误:
undefined method `login' for nil:NilClass
因此,请尝试在您的创建操作中找出 current_user
returns nil
的原因。可能是因为 session[:user_id]
未设置或未找到用户?
根据评论,问题是 CSRF 保护。由于 CSRF 错误,会话未在 create
中初始化,因此 current_user
为空白。
CSRF 保护通常在 ApplicationController
:
中启用
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
您应该找出 CSRF 保护启动的原因并修复它。禁用它会使您的站点不安全。看看 ruby security guide about CSRF.
这是我的 application_controller.rb
private
def current_user
return unless session[:user_id]
@current_user ||= User.find_by_id(session[:user_id])
end
helper_method :current_user
这是我 comments_controller.rb
的创建方法def create
@user = User.find(params[:user_id])
@user.comments.create(:user_id => @user.id, :commenter => current_user.login, :body => params[:comment][:body])
respond_to do |format|
format.js
format.html { redirect_to(@user, :notice => 'Comment was successfully created.') }
end
end
调用时显示:
nil:NilClass
的未定义方法“登录”什么可以阻止 current_user 被发现?
current_user
被正确找到。如果没有,就会有 NoMethodError
.
在你的例子中 current_user
只是返回 nil
。然后您尝试在 nil
上使用 .login
,这会导致您看到错误:
undefined method `login' for nil:NilClass
因此,请尝试在您的创建操作中找出 current_user
returns nil
的原因。可能是因为 session[:user_id]
未设置或未找到用户?
根据评论,问题是 CSRF 保护。由于 CSRF 错误,会话未在 create
中初始化,因此 current_user
为空白。
CSRF 保护通常在 ApplicationController
:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
您应该找出 CSRF 保护启动的原因并修复它。禁用它会使您的站点不安全。看看 ruby security guide about CSRF.