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