Rails可访问属性混淆

时间:2013-07-03 22:59:33

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

我对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]

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

做什么?

1 个答案:

答案 0 :(得分: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'。

上面的Wordy反馈。具体示例中,ActiveModel的代码和相关注释非常informative