1

我对 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_verificationattr_accessibleRails 会给出错误:

*未知属性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]

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

做什么?

4

1 回答 1

1

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

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

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

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

上面罗嗦的反馈。对于具体示例,ActiveModel 的代码和相关注释非常有用

于 2013-07-04T04:54:11.807 回答