在 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.