【问题标题】:Rails Accessible Attribute ConfusionRails 可访问属性混淆
【发布时间】:2013-07-03 22:59:33
【问题描述】:

我对 Ruby on Rails 比较陌生,我觉得我在这里做错了什么。我正在设置支付模式,但不知道如何处理可访问的属性。

我的 cash_transaction 模型有:

attr_accessible :billing_address_line_one, :billing_address_line_2, :billing_city, :billing_country, :billing_post_code, :payee_first_name, :payee_last_name, :card_expiry, :card_type

attr_accessor :card_number, :card_verification

好的,所以我想提交表单并验证,如果付款成功,将来可能会保存到数据库中。

如果我将:card_number, :card_verification 留在attr_accessible 中,Rails 会给出错误:

*未知属性card_number*

这很公平,因为我不想将其保存在我的数据库中。

当我尝试时:

@cash_transaction = current_user.cash_transactions.build(params[:cash_transaction])

当这些参数不在attr_accessible 中时,我会收到批量分配安全错误。

我已经解决了这两个错误:

@cash_transaction = current_user.cash_transactions.build(params[:cash_transaction].except(:card_number, :card_verification))
    @cash_transaction.card_number = params[:cash_transaction][:card_number]
    @cash_transaction.card_verification = params[:cash_transaction][:card_verification]

但这与使用哈希中包含的那些参数进行构建是一样的,所以我在作弊?

做什么?

【问题讨论】:

  • 你所做的一切看起来都很好。
  • 但是,看起来您应该能够批量分配虚拟属性。所以,只要你有attr_accessor :card_number,你应该可以将它添加到attr_accessible 并从params[:cash_transaction] 设置它。
  • 啊,好吧,所以两者都有?它似乎有效。

标签: ruby-on-rails ruby activerecord mass-assignment


【解决方案1】:

Rails 对几种injections 非常小心。这可能会令人困惑。

attr_accessible 是 Rails 的东西,类似于 Ruby 模块方法attr_accessor,但又有所不同。 attr_accessible 确实允许访问指定的参数,与attr_accessor 的方式非常相似(对象获得“getters”和“setters”)。 attr_accessible 还做了更多的工作来防止注射。

当传递参数字典来创建对象时,每个参数都会根据attr_accessible 定义的whitelist 进行检查。如果参数属于列表,它会被分配并持久化。如果不是,则会引发批量分配安全错误以防止任何不需要的分配——一个潜在的安全漏洞。 attr_accessor 并没有做所有这些,因为它在普通的 Ruby 中没有意义。

现在 card_numbercard_verification 不应根据您的规范进行持久化。它们属于仅与现金交易相关的逻辑,因此在这一点上选择实例属性似乎是一个不错的选择。作为 CashTransaction 实例的普通属性,它们需要被视为普通的 Ruby 访问方法。对所有内容的简短回答是@gylaz'。

上面罗嗦的反馈。具体的例子,A​​ctiveModel的代码和相关的cmet非常informative

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2013-09-25
    相关资源
    最近更新 更多