在私有控制器方法中返回redirect_to

2024-05-15

前言:我正在使用设备进行身份验证。

我试图阻止未经授权的用户查看、编辑或更新其他用户的信息。我最关心的是用户将 DOM 中的表单修改为另一个用户的 ID,填写表单,然后单击更新。我已经专门阅读过,像下面这样的东西应该有效,但事实并非如此。 SO 上的一篇文章建议移动validate_current_user方法进入公共领域,但这也不起作用。

有什么明显的我做错了吗?或者有更好的方法来完成我想做的事情,无论是使用设备还是其他东西?

My UsersController看起来像这样:

class UsersController < ApplicationController
  before_filter :authenticate_admin!, :only => [:new, :create, :destroy]
  before_filter :redirect_guests

  def index
    redirect_to current_user unless current_user.try(:admin?)

    if params[:approved] == "false"
      @users = User.find_all_by_approved(false)
    else
      @users = User.all
    end
  end

  def show
    @user = User.find(params[:id])
    validate_current_user
    @user
  end

  def new
    @user = User.new
  end

  def edit
    @user = User.find(params[:id])
    validate_current_user
    @user
  end

  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, :notice => 'User was successfully created.' }
      else
        format.html { render :action => "new" }
      end
    end
  end

  def update
    @user = User.find(params[:id])

    validate_current_user

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to @user, :notice => 'User was successfully updated.' }
      else
        format.html { render :action => "edit" }
      end
    end
  end

  private

  def redirect_guests
    redirect_to new_user_session_path if current_user.nil?
  end

  def validate_current_user
    if current_user && current_user != @user && !current_user.try(:admin?)
      return redirect_to(current_user)
    end
  end

end

The authenticate_admin!方法如下所示:

  def authenticate_admin!
    return redirect_to new_user_session_path if current_user.nil?

    unless current_user.try(:admin?)
      flash[:error] = "Unauthorized access!"
      redirect_to root_path
    end
  end

EDIT -- 你是什​​么意思“它不起作用?”

为了帮助澄清,当我尝试“破解”另一个用户的帐户时,我收到此错误:

在此操作中多次调用渲染和/或重定向。 请注意,您只能调用 render 或 redirect,并且最多 每个动作一次。另请注意,重定向和渲染都不会终止 执行操作,因此如果您想在之后退出操作 重定向,您需要执行类似“redirect_to(...) 和 返回”。

如果我将方法代码内联到各个控制器操作中,它们do工作。但是,我不想这样做,因为它不干。

我还应该指定我已经尝试过:

def validate_current_user
  if current_user && current_user != @user && !current_user.try(:admin?)
     redirect_to(current_user) and return
  end
end

如果你想一想,return在私有方法中只是退出该方法并将控制权传递回控制器 - 它不会退出操作。如果您想退出操作,则必须再次返回

例如,你可以有这样的东西:

class PostsController < ApplicationController
  def show
    return if redirect_guest_posts(params[:guest], params[:id])
    ...
  end

  private

  def redirect_guest_post(author_is_guest, post_id)
    redirect_to special_guest_post_path(post_id) if author_is_guest
  end
end

如果 params[:guest] 存在且不为 false,则私有方法将返回真实值,并且 #show 操作将退出。如果条件失败,则返回 nil,并且操作继续。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在私有控制器方法中返回redirect_to 的相关文章

随机推荐

  • TinyMCE 脏标志未设置或在编辑器离开后自动重置?

    配置 TinyMce 编辑器和一些功能后 如果用户进行了更改但没有保存 我现在想警告用户 为此 我正在检查 Blur 的脏标志 但它总是被设定的false 控制器 js this scope tinymceOptions selector
  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • malloc:***错误:已释放对象的校验和不正确 - 对象可能在释放后被修改

    我的 iOS 应用程序有一个大问题 它有时会崩溃 而没有详细的调试错误 堆栈跟踪为空 这是堆栈跟踪中仅有的两行 UIApplicationMain 中的 符号存根 UIHostedTextServiceSession DismissText
  • 使用 JavaScript 更改 HTML 内的日期格式

    我在页面上有以下代码 span class release date i class fa fa calendar i 2014 11 16 span This 2014 11 16是日期 由我的 CMS 自动生成 我需要更改这个日期 基本
  • 使用 Turbo C 编译并链接到 .com 文件

    我正在尝试使用 Turbo C 编译器和链接器编译一个简单的程序并将其链接到 DOS com 文件 我尝试了我能想到的最简单的 C 程序 void main Turbo C 链接器中是否有链接到 com 文件的命令行参数 我从链接器收到的错
  • 使用AJAX通过WebApi调用Delete方法

    我在 ASP Net Web 应用程序中使用 WebApi 我在控制器中有一个名为Delete我想通过使用 jQuery 的 AJAX 方法来访问此方法 下面是我的代码 Authorize public int Delete int pro
  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • 如何编写 Perl 脚本来使用 curl 处理 URL?

    我有一个非常简单的任务 我有一个 crontab 每小时运行一个脚本 该脚本旨在简单地处理 URL 这就是我所拥有的 这不起作用 我收到语法错误 usr bin perl curl http domain com page html 我已经
  • ASP.net C#.如何解析博客中的原子提要

    饲料位于 http latestpackagingnews blogspot com feeds posts default http latestpackagingnews blogspot com feeds posts default
  • 您可以用 Google 的 Protocol Buffer 格式表示 CSV 数据吗?

    我最近发现了协议缓冲区 想知道它们是否可以应用于我的特定问题 基本上 我有一些 CSV 数据 需要将其转换为更紧凑的格式以进行存储 因为其中一些文件有几GB CSV中的每个字段都有一个标题 并且只有两种类型 字符串和小数 因为有时有很多有效
  • 通过嵌套数组对象属性将数组映射到字符串数组

    拥有包含嵌套数组的对象数组 let arr name aaa inputs inputName input 1 groups groupName group a name bbb inputs inputName input 2 group
  • 将值设置为 aria-controls 输入

    我想设置一个输入咏叹调控制值 但我无法使用传统的 jQuery 方式来做到这一点 我的代码是这样的 function showMessage var message jQuery textToDisplay val example text
  • 在 pandas 条形图中设置 xticks

    我在下面的第三个示例图中遇到了这种不同的行为 为什么我能够正确编辑 x 轴的刻度pandas line and area 情节 但不与bar 修复 一般 第三个示例的最佳方法是什么 import numpy as np import pan
  • VIM 始终使用选项卡式页面

    我想要一个可以放入 vimrc 文件中的命令 该命令将使 vim 始终以选项卡式页面模式打开 而无需传递 p在命令行上 有这样的命令吗 如果没有 是否有更好的方法来做到这一点 目前 我正在使用 alias vi vim p 在我的 bash
  • ReactJS 水平对齐material-ui 元素

    我试图在文本输入旁边有一个单选按钮 这样用户基本上可以输入问题的 答案 并标记一个首选答案 然而 Material UI 将每个都放在自己的行上 这就是我目前所拥有的 div div
  • 如何在 R 中为回归量创建“宏”?

    对于长且重复的模型 我想创建一个 宏 在 Stata 中称为 宏 并通过以下命令完成 global var1 var2 其中包含回归量的模型公式 例如来自 library car lm income education prestige d
  • 正则表达式从字符串中提取 IP 和端口

    我正在使用 Perl 尝试从字符串中提取 IP 地址和端口 我尝试使用的正则表达式是 s sip 字符串是 sip 255 255 255 255 8080 transport TCP sip 255 255 255 255 8080 显然
  • Imgur API 版本 3 JavaScript 上传示例

    我在网上找到的所有示例都是早期版本的 Imgur API 或非 JS 代码 所有这些都使用新 API 中不存在的 API 密钥 相反 你会得到一个client id and secret 任何人都有示例代码 展示如何使用其 API 版本 3
  • 预期的 ProductField,出现数组问题

    我有一个 Rails 4 应用程序 它有一个如下所示的 params 块 def store params params require store permit name description user id products attr
  • 在私有控制器方法中返回redirect_to

    前言 我正在使用设备进行身份验证 我试图阻止未经授权的用户查看 编辑或更新其他用户的信息 我最关心的是用户将 DOM 中的表单修改为另一个用户的 ID 填写表单 然后单击更新 我已经专门阅读过 像下面这样的东西应该有效 但事实并非如此 SO