我对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]
但这与使用哈希中包含的参数构建一样,所以我在欺骗它?
做什么?
答案 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_number
和card_verification
不应该根据您的规范保留。它们只属于与现金交易相关的逻辑,因此在这一点上选择实例属性似乎是一个不错的选择。作为CashTransaction实例的普通属性,需要使用纯Ruby访问方法对它们进行处理。对所有这些的简短回答是@gylaz'。
上面的Wordy反馈。具体示例中,ActiveModel的代码和相关注释非常informative。