在 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 方法的正确方法是什么? 的相关文章

  • Rails 3:使用 Simple_form 如何创建一个向specialities#create 发布帖子的表单?

    如何使用 Simple form 创建一个向specialities create 发布帖子的表单 我试过这个
  • 如何在 gem 的示例脚本中使用 pry-byebug ?

    我正在制作我的第一个 gem 它不是 Rails 应用程序 而是一个带有一些 AI 的 tic tac toe 库 这样我就可以与一个永远不会输的计算机对手比赛 并在可能的情况下强行获胜 现在我正在尝试调试人工智能中的攻击策略 但我似乎无法
  • Ruby mp3 Id3 解析

    目前我正在从事一个音乐项目 处理用户 mp3 上传 问题是我找不到适用于所有文件的 id3 库 我努力了id3 ruby and Mp3Info库 但它们都没有给我一致正确的结果 例如 最常见的问题 错误的流参数 比特率和采样率 有时是持续
  • 使用复选框过滤列表

    我有一个电影列表及其评级 在我的页面顶部 我有一个表单 其中提供了一个复选框列表 其中显示了每个可用的评级 G PG 13 等 一旦用户单击复选框并点击提交 我只想显示所选的电影 在我的索引方法中 我有一个名为的实例变量 filtered
  • 在 CircleCI 中设置 Elasticsearch 和 Ruby on Rails

    我正在尝试在 Rails 应用程序中使用 Elasticsearch 设置 CircleCI 我想已经配置了镜像 但是如何在 CI 中连接到它 到目前为止我已经尝试过 https github com elastic elasticsear
  • ||= 是什么意思? [复制]

    这个问题在这里已经有答案了 我的应用程序控制器中有一个受保护的方法 def current user current user User find by id session user id end 我想知道什么 方法 我一直在努力寻找和找
  • 通过 ESI:include 设置 Cookie,如何?

    我正在尝试使用 esi 在我的网站上创建忍者缓存 这个想法是 该网站大部分是静态的 我只需要在用户是否登录时做一些花哨的事情 所以我试图在页面A上放置一个 并在页面B的应用程序中设置触发器 这样我就可以将页面 A 缓存在 varnish 上
  • Rails 5:验证复选框的接受

    我有一个带有一些嵌套字段的注册表单 在该表单中我添加了一个服务条款的复选框 我正在尝试验证复选框何时被选中 如果没有 则返回错误 validates acceptance of agreement allow nil gt true acc
  • 主页的 RefineryCMS 路线不起作用

    刚刚开始使用RefineryCMS 抱歉新手问题 它在本地运行良好 并幸运地部署在 Heroku Cedar 堆栈上 创建了一个名为 主页 的页面 pages home 响应良好 路线 rb root to gt pages home 并在
  • class_eval、class_exec、module_eval 和 module_exec 之间有什么区别?

    我正在读Module文档 但似乎无法理解它们的差异以及应该在哪里使用 怎么样eval不同于exec 我将回答比你的问题更多的内容 包括instance eval exec 在你的问题中 所有变体 instance module class
  • 两个 ruby​​ 进程之间的通信可能/容易吗?

    如果我有一个 ruby 脚本Daemon顾名思义 它作为守护进程运行 监视系统的某些部分并能够执行需要身份验证的命令 例如更改权限 是否有一种简单的方法来拥有第二个 ruby 脚本 例如client 与该脚本通信并向其发送命令 询问信息 我
  • 检查rails devise ldap gem中的组成员身份,是否在yaml中?

    我是否应该使用 ldap yml 文件来确保使用 ldap 进行身份验证的人拥有分配给他们的正确组以允许他们进入 无论如何 我都不是 AD 专业人士 这让我很困惑 什么是组和属性 据我了解 我们在 AD 中有一个用户 他们有一个 samAc
  • 为什么||和 或 在 Rails 中的行为有所不同? [复制]

    这个问题在这里已经有答案了 可能的重复 i true 和 false 在 Ruby 中是真的吗 https stackoverflow com questions 2802494 i true and false in ruby is tr
  • 带回形针、导轨的水印图像 4

    我一直在尝试按照中列出的答案向我的图像添加水印带有回形针的水印 https stackoverflow com questions 13517757 watermark with paperclip 水印 rb module Papercl
  • Capybara with Rails:如何仅查找不可见元素

    我正在 Rails 项目 Rails 5 2 0 中使用 Capybara capybara 3 1 0 进行系统测试 确保元素不可见的方法是什么 我当时用的是visible false选项 直到我发现它也匹配可见元素 例如我使用 find
  • Rspec to have(n).items undefined 方法

    我正在尝试遵循指南关于代码 tuts http code tutsplus com tutorials ruby for newbies testing with rspec net 21297我不断收到错误 这是我的库规范 require
  • puma systemd 脚本无法启动 puma

    我已经从多个来源复制并粘贴了以下美洲狮系统启动脚本的片段 但它不起作用 系统是Debian 9 6 用户rails红宝石通过安装rvm 用户rails可以启动命令RAILS ENV production bundle exec puma C
  • 我必须使用什么加密程序来通过 HTTP 协议发送加密的“电子邮件”和“密码”值?

    我正在使用 Ruby on Rails 3 我想通过 HTTP 协议发送 电子邮件 和 密码 值 我知道 我不应该 但我需要 我需要从发送用户凭据我的客户申请到一个我的服务应用 我可以使用公共和私人RSA密钥来实现这一点 但如果是这样 我不
  • 在 mac os Sierra 上,卡在“设置 CocoaPods 主存储库”上

    转移到 mac os sierra 后 我完全格式化了我的 mac 现在每次运行时我都面临安装 cocoapods 的问题sudo gem install cocoapods pre一切都安装得很好 当我尝试安装 Pod 时 终端堆栈打开S
  • Rails 3.1 中何时将图像放入 app/assets 以及何时放入 /public/images?

    我仍然不太明白 在这种情况下 在 Rails 3 1 中将图像放在哪里 图像被处理 例如通过回形针或蜻蜓 并存储在文件夹中 不使用像 s3 这样的外部服务 f e 在开发中 当我只有图像时 我将在样式表中使用它 例如背景 图标 AppSto

随机推荐

  • 使用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