before_filter :require_owner

2023-11-25

我有许多资源(行程、时间表等),其操作应仅限于资源所有者。

如何使用 ApplicationController 中定义的 #require_owner 方法来实现代码来实现此目的?理想情况下,代码将查找所有者的继承链,以便 before_filter 将处理属于_to :trip 的 :comment 和属于_to :user。

class TripsController < ApplicationController
  belongs_to :member
  before_filter :require_owner

  ...

end

我没有完全遵循描述(评论真的属于旅行所有者吗?),但稍微扩展一下 jonnii 的答案,这里是一个限制旅行控制器的示例:

class ApplicationController < ActionController::Base
  ...
protected
  # relies on the presence of an instance variable named after the controller
  def require_owner
    object = instance_variable_get("@#{self.controller_name.singularize}")
    unless current_user && object.is_owned_by?(current_user)
      resond_to do |format|
        format.html { render :text => "Not Allowed", :status => :forbidden }
      end
    end
  end
end

class TripsController < ApplicationController
  before_filter :login_required # using restful_authentication, for example
  # only require these filters for actions that act on single resources
  before_filter :get_trip, :only => [:show, :edit, :update, :destroy]
  before_filter :require_owner, :only => [:show, :edit, :update, :destroy]
  ...
protected
  def get_trip
    @trip = Trip.find(params[:id])
  end
end

假设模型如下所示:

class Trip < ActiveRecord::Base
    belongs_to :owner, :class_name => 'User'
    ...
    def is_owned_by?(agent)
      self.owner == agent
      # or, if you can safely assume the agent is always a User, you can 
      # avoid the additional user query:
      # self.owner_id == agent.id
    end
end

The login_required方法(由restful_authentication或authlogic等auth插件提供或依赖)确保用户已登录并为用户提供current_user方法,get_trip设置随后检入的行程实例变量require_owner.

只要该模型已实现is_owned_by?方法。如果您在资源是评论时尝试检查它,那么您将处于CommentsController:

class CommentsController < ApplicationController
  before_filter :login_required # using restful_authentication, for example
  before_filter :get_comment, :only => [:show, :edit, :update, :destroy]
  before_filter :require_owner, :only => [:show, :edit, :update, :destroy]

  ...
protected
  def get_comment
    @comment = Comment.find(params[:id])
  end
end

with a Comment模型看起来像:

class Comment < ActiveRecord::Base
  belongs_to :trip

  # either 
  #  delegate :is_owned_by?, :to => :trip
  # or the long way:
  def is_owned_by?(agent)
    self.trip.is_owned_by?(agent)
  end
end

确保在执行此操作时检查日志,因为如果您不小心,依赖于关联的检查可能会导致大量查询。

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

before_filter :require_owner 的相关文章

随机推荐

  • 计算数组中重复整数的数量

    如果我有这个向量 x 1 1 1 1 1 2 2 2 3 4 4 6 6 6 6 我想根据其本身获得每个唯一数字的位置 y 1 2 3 4 5 1 2 3 1 1 2 1 2 3 4 目前我正在使用 y sum triu x x MATLA
  • 将带有 html 的本地图像添加到 Shiny 应用程序

    我正在尝试添加位于我的计算机上的图像 但它不起作用 我创建一个 test html 文件 当我用浏览器 firefox 打开它时 它会呈现图像 但是当我尝试在 Shiny 中使用相同的代码时 它不起作用 下面是我正在尝试的代码 html C
  • 执行Windows命令行命令后如何获取Java中的返回码

    我现在正在用Java做类似的事情 Process p Runtime getRuntime exec ping n 1 w 100 127 0 0 1 如何读取 Windows 执行代码 我已经知道如何读取命令的命令行输出 但是如果我只想用
  • socket.io:客户端发出回调永远不会触发

    只是为了概念证明而摆弄 socket io 到目前为止一切都工作得很好 除了我无法让我的发出回调在客户端工作 我必须在这里遗漏一些愚蠢的东西 但文档目前还不是杀手 服务器很好地接收了 getSomeData 事件 没有任何错误 从我在客户端
  • 用数字键组合两个数组而不覆盖旧键

    我不想使用 array merge 因为它会导致 我误解了具有相同键的所有值都会被覆盖 我有两个数组 array1 array 0 gt foo 1 gt bar array2 array 0 gt bar 1 gt foo 并想将它们结合
  • 来自“FIRRemoteConfigValue!”不相关的类型“String”总是失败

    我的项目中有大约 50 个相同的警告 自从更新以来 我调用的所有函数snapshot value something as String正在失败 他们以前都工作过 我什至没有使用 RemoteConfig 功能 我只是想检索数据 我的用户类
  • JavaScript 标签的 src 属性是否会在所有浏览器中遵循 HTTP 重定向

    假设一个 javascript 标签的 src 属性指向一个重定向 where http foo com foo js是 301 重定向到https foo com foo js 所有浏览器都能成功加载JS文件吗 我注意到它似乎可以在 Ch
  • Spring JDBC BeanPropertyRowMapper yes no ('Y','N') 到布尔 bean 属性

    我有一个带有一些字符串 整数和布尔字段的类 我为他们声明了 getter 和 setter public class SomeClass private int id private String description private b
  • 由于 ,无法将 .Union 与 Linq 一起使用

    我有点被这个问题困扰了 希望我能得到一些帮助 这就是重点 我必须用该 SQL 请求填充我的 DataGridView SELECT LOT NumLot EtatLot NomEmploye FROM LOT JOIN AFFECTATIO
  • 如何优雅地关闭因关闭执行该应用程序的命令行而终止​​的 Java 应用程序?

    有一个已回答的问题优雅地关闭 Java 命令行程序的最佳方法 当程序被 Ctrl C 终止时 关闭挂钩会执行此任务 我的问题是如果在Java程序执行过程中命令行本身关闭了如何优雅退出 我用关闭挂钩进行了测试 但在这种情况下它不起作用 我无法
  • 用 jQuery 制作一个逃跑按钮

    我想创建一个带有简单按钮的页面 当用户尝试单击它时 该按钮会远离用户 我们可以称之为 逃跑 按钮吗 有没有一个简单的 jQuery 片段可以让我做同样的事情 问候 卡兰 米斯拉 button hover function this css
  • ios mapkit 通过点击地图关闭注释标注

    我有一个地图套件应用程序 可以在地图上放置注释 当您按下它们时 它会显示带有标题属性的标注 这工作正常 但用户无法关闭它们 它们保持打开状态 直到点击另一个注释 我不能让用户可以点击地图上的其他位置 或再次点击注释 来关闭它吗 我有一种感觉
  • Windows Powershell 中的 Unix tail 等效命令

    我必须查看大文件的最后几行 典型大小为 500MB 2GB 我正在寻找相当于 Unix 命令的命令tail对于 Windows Powershell 一些可用的替代方案是 http tailforwin32 sourceforge net
  • VB.NET 窗口屏幕截图 (ALT+PRINTSCREEN)

    我在某处找到了该代码 我发现它非常有用 但我想找到一种方法使其工作 以便它仅捕获给定的窗口目标 可能带有进程 ID 或窗口名称 即使该窗口未处于活动状态 我不想使该窗口处于活动状态 但想要获得屏幕截图 就像我在其上执行 Alt PrintS
  • TypeScript:根据字符串文字属性一般推断联合类型成员

    TypeScript v3 2 2 允许我定义接口的联合 每个接口都有一个唯一的字符串文字属性 可以用作类型保护 例如 type Device Laptop Desktop Phone interface Laptop type Lapto
  • 如果给定表达式*不*格式良好,“anti-SFINAE”将启用重载

    如果特定表达式的格式不正确 则可以轻松使用 SFINAE 隐藏特定函数重载 但我想做相反的事情 隐藏重载当且仅当给定表达式is格式良好 并且以非常通用的方式这样做 我有一个适用于 clang 3 5 0 和 gcc 5 2 0 的解决方案
  • 在 C++ 程序中以编程方式检测字节顺序

    是否有一种编程方法来检测您是否处于大端或小端架构上 我需要能够编写在 Intel 或PPC系统并使用完全相同的代码 即没有条件编译 我不喜欢基于类型双关的方法 它经常会被编译器警告 这正是工会的目的 bool is big endian v
  • 如何映射联合数组类型?

    我有以下结构 interface Test1 number number interface Test2 extends Test1 text string let test Test1 Test2 test map obj gt does
  • JavaScript 中的空白字符串是真还是假?

    这个表情 true回报false 意思是 是虚假的 然而if console log true else console log false 得到结果为真 现在我很困惑 空白字符串是真还是假 字符串 是一个 真实 值 以下是 假 值的列表
  • before_filter :require_owner

    我有许多资源 行程 时间表等 其操作应仅限于资源所有者 如何使用 ApplicationController 中定义的 require owner 方法来实现代码来实现此目的 理想情况下 代码将查找所有者的继承链 以便 before fil