在操作中多次调用渲染和/或重定向

时间:2016-01-22 08:27:04

标签: ruby-on-rails devise authorization pundit

我正在使用Devise和Pundit。 要创建新的配置文件页面,必须授权用户执行此操作。 自从我第一次实现它以来,它一直运行良好,但今天它刚刚开始使用错误消息:

  

在此操作中多次调用渲染和/或重定向。   请注意,您最多只能调用渲染或重定向   每次行动一次。另请注意,重定向和渲染都不会终止   执行动作,所以如果你想在之后退出动作   重定向,你需要做一些像“redirect_to(...)和   返回”。

这是我的应用程序控制器中的代码:

    rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
    ...

    private

    def user_not_authorized(exception)
        flash[:alert] = "Sorry, you are not authorized to perform this action."
        redirect_to(request.referrer || root_path)
    end

这是我的ProfilePage控制器:

def new
  @profile_page = ProfilePage.new
  authorize @profile_page
end

def create
  @profile_page = ProfilePage.new(profile_page_params)
    respond_to do |format|
      if @profile_page.save
        format.html { redirect_to @profile_page, notice: 'Profile page was successfully created.' }
        format.json { render :show, status: :created, location: @profile_page }
      else
        format.html { render :new }
        format.json { render json: @profile_page.errors, status: :unprocessable_entity }
      end
    end
    authorize @profile_page
  end

有人建议我在flash[:alert]下面添加以下代码:

self.response_body = nil

但现在我的用户再次被重定向到“新个人资料”页面,而不是成功的个人资料页面。它还告诉用户他们无权完成此操作,尽管它已经授权他们这样做。

1 个答案:

答案 0 :(得分:3)

在创建操作中,您必须在保存记录之前放置授权逻辑:

你必须搬家

authorize @profile_page
在初始化@profile_page之后,

位于创建操作的顶部,如下所示:

def create
  @profile_page = ProfilePage.new(profile_page_params)
    authorize @profile_page

    respond_to do |format|
      if @profile_page.save
        format.html { redirect_to @profile_page, notice: 'Profile page was successfully created.' }
        format.json { render :show, status: :created, location: @profile_page }
      else
        format.html { render :new }
        format.json { render json: @profile_page.errors, status: :unprocessable_entity }
      end
    end
end