【问题标题】:the AbstractController::DoubleRenderError cannot be fixed with "redirect_to and return"AbstractController::DoubleRenderError 不能用“redirect_to and return”修复
【发布时间】:2020-03-28 10:57:36
【问题描述】:

我今天尝试为用户控制器使用一些辅助方法时遇到此错误:

AbstractController::DoubleRenderError(在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,并且 每个动作最多一次。另请注意,重定向和渲染都不会终止操作的执行,因此如果要在重定向后退出操作,则需要 做一些类似“redirect_to(...) and return”的事情。)

我将以下助手放在application_controller.rb 中:

class ApplicationController < ActionController::Base

    def current_user
      User.find_by :id=>session[:user_id]
    end

    def log_in?
      !!session[:user_id]
    end

    def log_in_first
        if !log_in?
          session[:error]="You have to log in first to continue your operation"
          redirect_to("/login") and return
        end
      end

      def correct_user?
        if !(current_user.id.to_s==params[:id])
          session[:error]="You have no right to do this operation."
          redirect_to "/"
          return
        end
      end
end

这里是user_controller.rb

class UsersController < ApplicationController

    def new
        @user = User.new
    end

    def create
        @user = User.new(user_params)
        if @user.save
          session[:user_id]=@user.id
          redirect_to user_path(@user)
        else
          render 'new'
        end
    end

    def show
        log_in_first
        @user = User.find_by id: params[:id]
        correct_user?
        if @user
            render 'show'
        else
            redirect_to '/login'
        end
    end



    private
      def user_params
        params.require(:user).permit(:name,:password,:email,:email_confirmation)
      end
end

如您所见,我尝试在log_in_firstcorrect_user? 中同时使用returnand return 来解决问题,但它仍然不起作用。有人有什么想法吗?

【问题讨论】:

  • 为用户控制器添加代码。
  • @dbugger 我只是添加了 userscontroller 文件。谢谢!

标签: ruby-on-rails activerecord error-handling


【解决方案1】:

问题出在show 操作中,log_in_first 重定向然后 show 操作执行它想要的任何操作,即重定向或渲染。这是导致错误的原因。

更好的解决方案是使用before_action 进行身份验证和授权,让用户控制器操作完成他们的工作。如下所示。

  class ApplicationController < ActionController::Base

    def current_user
      User.find_by :id=>session[:user_id]
    end

    def log_in?
      !!session[:user_id]
    end

    def authenticate_user!
      if !log_in?
        session[:error]="You have to log in first to continue your operation"
        redirect_to("/login")
      end
    end

     def authorize_user!
       unless current_user&.id.to_s==params[:id]
         session[:error]="You have no right to do this operation."
         redirect_to "/"
       end
     end
  end

class UsersController < ApplicationController
  before_action :authenticate_user!, only: [:show]
  before_action :authorize_user!, only: [:show]

    def new
        @user = User.new
    end

    def create
        @user = User.new(user_params)
        if @user.save
          session[:user_id]=@user.id
          redirect_to user_path(@user)
        else
          render 'new'
        end
    end

    def show
      @user = User.find_by id: params[:id]
      render 'show'
    end

    private
      def user_params
        params.require(:user).permit(:name,:password,:email,:email_confirmation)
      end
end

【讨论】:

  • 谢谢!这样可行。我只是不能投票,因为我没有足够的声誉......
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多