2013-07-03 64 views
1

我对Ruby on Rails比较新,我觉得我在这里做错了什么。我正在设置一个付款模式,并且无法弄清楚如何执行可访问的属性。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 

好了,我想提交表单和验证,并可能保存在未来的数据库,如果付款到帐。

如果我在attr_accessible离开:card_number, :card_verification,Rails的给出了错误:

*未知属性CARD_NUMBER *

,因为我不希望保存在我的DB这是不够公平的。

当我尝试:

@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] 

但是,这只是一样与这些参数包括建设中的散列反正所以我作弊呢?

什么?

+3

你在做什么看起来完全没问题。 – gylaz

+1

但是,它看起来应该能够批量分配虚拟属性。所以,只要你有'attr_accessor:card_number',你应该可以将它添加到'attr_accessible'并且从'params [:cash_transaction]'中设置它。 – gylaz

+0

啊,好吗?它似乎工作。 –

回答

1

Rails对于几种injections十分小心。这可能会让人困惑。

attr_accessible是一个Rails的东西,类似于红宝石模块方法attr_accessor,但又不同。 attr_accessible确实允许访问指定的参数,这与attr_accessor(该对象获取“getters”和“setters”)的方式大致相同。 attr_accessible也做了更多的工作来防止注射。

当传递参数字典来创建对象时,将根据attr_accessible定义的whitelist检查每个参数。如果该参数属于该列表,则会被分配并保留。如果不是,则会引发质量分配安全性错误,以防止发生不必要的分配---一个潜在的安全漏洞。 attr_accessor并没有做到这一点,因为它在纯Ruby中没有意义。

现在card_numbercard_verification不应该根据您的规格坚持。它们只属于与现金交易有关的逻辑,所以选择实例属性在这一点上似乎是一个不错的选择。作为CashTransaction实例的普通属性,它们需要像普通的Ruby访问方法那样对待。所有这一切的简短答案是@gylaz'。

上面的词反馈。有关具体示例,ActiveModel的代码和相关注释非常简单,为informative