在 Ruby on Rails 中重写 setter 方法的正确方法是什么?

2024-02-28

我正在使用 Ruby on Rails 3.2.2,我想知道以下是否是覆盖我的类属性的 setter 方法的“正确”/“正确”/“确定”方法。

attr_accessible :attribute_name

def attribute_name=(value)
  ... # Some custom operation.

  self[:attribute_name] = value
end

上面的代码似乎按预期工作。然而,我想知道,通过使用上面的代码,将来我是否会遇到问题,或者至少,Ruby on Rails“我应该期望”/“可能会发生什么问题”。如果这不是重写 setter 方法的正确方法,那么正确的方法是什么?


Note: 如果我使用代码

attr_accessible :attribute_name

def attribute_name=(value)
  ... # Some custom operation.

  self.attribute_name = value
end

我收到以下错误:

SystemStackError (stack level too deep):
  actionpack (3.2.2) lib/action_dispatch/middleware/reloader.rb:70

=================================================== ========================= 更新:2017 年 7 月 19 日

Now the Rails 文档 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Overwriting+default+accessors还建议使用super像这样:

class Model < ActiveRecord::Base

  def attribute_name=(value)
    # custom actions
    ###
    super(value)
  end

end

=================================================== =========================

原答案

如果您想在通过模型访问时覆盖表列的 setter 方法,可以采用这种方法。

class Model < ActiveRecord::Base
  attr_accessible :attribute_name

  def attribute_name=(value)
    # custom actions
    ###
    write_attribute(:attribute_name, value)
    # this is same as self[:attribute_name] = value
  end

end

See 覆盖默认访问器 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Overwriting+default+accessors在 Rails 文档中。

因此,您的第一个方法是在 Ruby on Rails 模型中覆盖列设置器的正确方法。 Rails 已经提供了这些访问器来访问表的列作为模型的属性。这就是我们所说的 ActiveRecord ORM 映射。

另请记住,attr_accessible模型顶部与访问器无关。它具有完全不同的功能(参见这个问题 https://stackoverflow.com/questions/3136420/difference-between-attr-accessor-and-attr-accessible)

但在纯 Ruby 中,如果您已经为类定义了访问器并想要覆盖 setter,则必须使用实例变量,如下所示:

class Person
  attr_accessor :name
end

class NewPerson < Person
  def name=(value)
    # do something
    @name = value
  end
end

一旦你知道了什么,就会更容易理解attr_accessor做。代码attr_accessor :name相当于这两个方法(getter和setter)

def name # getter
  @name
end

def name=(value) #  setter
  @name = value
end

另外,您的第二个方法也会失败,因为当您调用相同的方法时,它会导致无限循环attribute_name=在该方法内部。

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

在 Ruby on Rails 中重写 setter 方法的正确方法是什么? 的相关文章

  • 调整回形针大小以适合矩形框

    我有一个矩形图像 例如 30x800 像素 如何用回形针缩放它以保留 100x100 像素图像的纵横比 并用边框填充空白区域 一个例子 http www imagemagick org Usage thumbnails pad extent
  • 如何让 mysql 输出 DateTime 到儒略日数?

    基本上我正在使用用于 Ruby 的 MySQL gem http www tmtm org en mysql ruby 并且我对日期比较没有合理的支持 这Mysql Time类只为我提供了访问器方法 如年 月 秒等 如果我可以将其转换为 R
  • 设计...用户模型的附加列未验证

    我正在 Rails 3 应用程序中使用 Devise 进行身份验证 我通过 db migrate 将名字和姓氏列添加到数据库中 注册表修改如下 p br p p br p
  • 如何按值降序对哈希进行排序并在 ruby​​ 中输出哈希?

    output sort by k v v reverse 和钥匙 h a gt 1 c gt 3 b gt 2 d gt 4 gt a gt 1 c gt 3 b gt 2 d gt 4 Hash h sort 现在我有这两个 但我试图按值
  • 遏制gem安装:捆绑安装失败,但正常gem安装有效[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions solve
  • 如何在 Ruby 中使用循环输出所有可能的组合?

    我刚刚开始学习编程 并试图编写一个输出所有可能组合的函数 到目前为止 我已经能够找到尺寸 2 的所有可能组合 但我不确定如何使代码保持开放式以处理更大尺寸的组合 某种递归会有用吗 我知道我可以使用内置的组合方法 但我只是想弄清楚如何从头开始
  • 为什么 Chrome Devtools 中的 Ruby 文件 (.erb) 无法使用语法高亮显示?

    根据本新闻稿 Chrome 开发者工具可以对多种语言进行语法高亮显示 包括 erb 文件 https plus google com GoogleChromeDevelopers posts MnikfMyJ14X https plus g
  • 具有多个可选参数的 Rails 3 路线

    我正在尝试创建一个具有可选参数和不同顺序的 Rails 路线 这个问题描述了一个类似的问题 具有多个 可选且漂亮参数的路由 https stackoverflow com questions 14007593 routes with mul
  • 仅适用于安全页面的安全回形针 URL

    我正在尝试找到使回形针网址安全的最佳方法 但仅限于安全页面 例如 显示存储在 S3 中的图像的主页是http mydomain com http mydomain com图像网址是http s3 amazonaws com mydomain
  • 如何保存包含框架/iframe 的完整 html 页面?

    在网页抓取期间 我想将当前页面的 html 保存到文件中以供以后调试 browser html在大多数情况下有帮助 但是当页面包含 iframe frame 时 它 的内容不会返回browser html 我必须用类似的东西单独得到它bro
  • AJAX Rails 验证

    我的表单和验证可以很好地处理常规的 http 请求 我希望它使用 AJAX 我知道我可以在客户端进行验证 但这似乎是多余的 因为我已经在模型中定义了验证 当用户填写表单时 我想就他们的条目向他们提供反馈 在 AJAX 表单中使用 Rails
  • 按顺序重载每个方法

    我有一个 erb 模板 它为 httpd conf 生成配置文件 重要的是 最后写入特定位置 它是包罗万象的 目前代码看起来像 cluster apps each do app Render config end 我想重载应用程序对象上的每
  • 使用 Ruby CSV 标头转换器

    假设我有以下课程 class Buyer lt ActiveRecord Base attr accesible first name last name 以及 CSV 文件中的以下内容 First Name Last Name John
  • 如何在 Rails 中制作动态下拉菜单?

    我正在开发一个电子商务项目 其中将有用于选择尺寸的单选按钮 我有一个数量下拉菜单 我想根据用户所选尺寸的可用库存使此下拉列表动态化 谁能告诉我如何在 Rails 上做到这一点 不会用大量的 javascript 扰乱我的视图文件 如果您使用
  • Ruby Regex 舍入尾随零

    我正在寻找一个正则表达式来删除十进制数字中的尾随零 它应该返回以下结果 0 0002300 gt 0 00023 10 002300 gt 10 0023 100 0 gt 100 1000 gt 1000 0 0 gt 0 0 gt 0
  • Rails 5 deviseomniauth-facebook 错误:抱歉,出了点问题

    我按照 Devise 的官方指南从上到下本节 https github com plataformatec devise wiki OmniAuth Overview logout links My CALLBACK URL is http
  • Rails 的 Puma Systemd 配置不起作用

    我已经完成了一个使用 Ruby on Rails 构建的应用程序 现在我想将其托管在 AWS 上的 EC2 实例上 我已经为其配置了服务器 并且正在使用pumaHTTP服务器作为应用服务器 在生产中启动应用程序总是需要我运行RAILS EN
  • 在 Rails 3 和 ActionMailer 中,是否可以使用 TLS over SSL(不是 StartTLS)发送电子邮件?

    我想使用 ActionMailer 从我的铁路应用程序发送电子邮件 我有一个想要使用的现有邮件服务器 但它仅支持端口 465 上的 SSL TLS 但是 它不支持 StartTLS 通常在端口 587 上 谁能建议一种实现这一目标的方法 据
  • Kotlin:覆盖子类型中的通用属性

    我试图编写一些通用代码 但无法摆脱Type of PROPERTY is not a subtype of the overridden property error 我的代码的简化版本 abstract class BaseP
  • 在 Ruby 中生成 GUID

    我有一个问题 用 GUID 很容易解决 特别是 对于密码重置工作流程 我想将 GUID 令牌发送到用户的电子邮件并让他们使用该令牌重置密码 由于 GUID 是唯一的 因此这非常安全 并且可以避免我通过电子邮件向人们发送密码 这是有风险的 我

随机推荐

  • 使用selenium webdriver java 4.0v捕获网络流量

    我想捕获 Chromedriver 窗口中生成的网络流量 我发现可以使用 selenium 4 0 DevTools 实用程序来完成此操作 但我找不到如何操作或良好的文档 https www selenium dev selenium do
  • hive hadoop 上可用的数据可视化工具

    请推荐一些可以在 Hive Hadoop 上运行的可视化工具 唯一的事情是 它应该接受Hive 这取决于您想要的数据分析和可视化类型 如果您打算使用专有工具 那么Tableau http www tableausoftware com so
  • pyspark没有模块名称错误

    这是我正在遵循的教程中的确切代码 我的同学使用相同的代码没有收到此错误 ImportError Traceback most recent call last
  • 当没有传递参数时如何读取标准输入?

    当我想在没有传递参数 文件 的情况下使用标准输入时 脚本不起作用 有什么方法可以在这段代码中使用标准输入而不是文件吗 我试过这个 if n 1 check if argument exists then 1 stdin if not use
  • 确定函数是否是异步信号安全的(可以在信号处理程序内部调用)

    我的问题是 如果您无权访问函数的实现 是否有办法最终确定函数是否是异步信号安全的 如果没有 有没有办法测试函数是否足够异步信号安全 可以从信号处理程序调用 如果您阅读 signal 或 sigaction 的手册页 您将获得异步信号安全函数
  • 为什么 ContentResolver 看不到其他应用程序添加的文件?

    我将文件添加到Documents MyExcelsFolder通过使用ContentResolver insert然后还将新文件添加到Documents MyExcelsFolder另一个应用程序的文件夹 例如文件管理器 然后我尝试从以下位
  • 平滑地朝目标对象旋转对象

    我想将我的玩家车辆旋转到目标对象方向 侧面 通过下图 我试图以更好的方式解释我的观点 我想将下面的坦克对象旋转到另一个坦克对象 以便它可以指向那个方向 我为此目的编写了这段代码 但它不起作用 IEnumerator DoRotationAt
  • 为什么多行 TextView 中的换行内容会填充父级?

    我将多行文本视图设置为android layout width wrap content 当渲染时 它会占用父级的所有可用宽度 当文本可以容纳在一行中时 wrap content工作正常 但在两行或更多行时 文本视图似乎与父级宽度相匹配 在
  • 在Panorama GUI中找到三个JS坐标?

    我过去玩过一点 ThreeJS 现在正在进行一个新项目 试图在全景中设置热点 我记得使用相机移动车 http davidpaulrosser github io Threejs camera dolly http davidpaulross
  • 为什么我从 Firebase 动态链接 API 收到服务器错误?

    我正在尝试使用 Firebase API 和google api client Ruby gem https github com google google api ruby client 这是我正在使用的代码 配有内联 Gemfile
  • UITextField 中的静态字符前缀

    是否有一种内置方法可以将字符前缀添加到UITextField喜欢下面的截图吗 如果不是 那么实现这一目标的最佳 最直接的方法是什么 我在想background财产也许能够做到这一点 只需添加一个灰色UILabel在上面UITextField
  • 当我的活动依赖于通过 Intent 传递的额外内容时,如何编写 Android JUnit 测试?

    我正在为一个类编写一个 android Junit 测试 该类依赖于通过 Intent 传递给它的额外内容 我能够让该类正常工作 但我仍然想知道如何为这样的类编写单元测试 因为测试仍然失败 public class AddClassEven
  • 如何在 Ruby 中实现进度条?

    我们想要在我们的 Ruby 应用程序之一中实现文件上传进度条 这需要显示上传的确切百分比 然而 尽管我们尽了最大努力 我们还是找不到一种方法来实现完全复制文件上传过程的进度条 您能帮我们解决这个问题吗 如果您使用 Apache 和 Pass
  • 在查询之间引用字段值

    我试图通过使用查询在 Access 中创建计算 目前 一个查询计算 MPP Oil 最大生产潜力 的值 另一个查询需要使用该值来计算 未分配损失 这些计算使用来自基本查询 PEBaseQuery 的公司 资产 年份数据 计算未分配损失的其他
  • T-SQL 语法问题 - 在 CASE 语句中使用 OR

    我想构建一个包含以下逻辑的 CASE 语句 但 sql 编译器不喜欢我的语句中的 OR CASE expression WHEN expression1 OR expression2 THEN
  • IntelliJ IDEA 空构造函数/方法代码风格

    如何调整 Java 的 IntelliJ IDEA 14 代码风格 使其在打开空构造函数 方法后立即保持关闭大括号 E g class A private A public void b Go to 设置 代码风格 Java 换行和大括号并
  • Shiny 允许用户选择要显示的绘图输出

    我有一个闪亮的应用程序 我的服务器功能如下所示 shinyServer function input output session filedata lt reactive infile lt input file1 if is null
  • Visual Studio 代码“获取扩展时出错。XHR 失败”

    This problem started a few weeks ago when I started using NordVPN on my laptop When I try to search for an extension and
  • 首次出现在斯特恩的双原子序列中

    你得到一个整数n 你需要找到它在斯特恩双原子序列中第一次出现的索引 序列定义如下 a 0 0 a 1 1 a 2 i a i a 2 i 1 a i a i 1 See 数学世界 http mathworld wolfram com Ste
  • 在 Ruby on Rails 中重写 setter 方法的正确方法是什么?

    我正在使用 Ruby on Rails 3 2 2 我想知道以下是否是覆盖我的类属性的 setter 方法的 正确 正确 确定 方法 attr accessible attribute name def attribute name val