2013-07-03 97 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