0

在我的Ruby on Rails應用程序中,我試圖在驗證中添加以確保用戶在文本框中輸入了值。在我的系統中,我有一個名爲Account的表,它存儲用戶的電子郵件帳戶信息,當他們進入views/accounts/_form.html.erb頁面添加新的電子郵件帳戶時,我想驗證是否存在端口號。我可以通過下面的代碼做到這一點:Ruby on Rails:如何在特定頁面上驗證?

validates :port, presence: true 

這成功地確保用戶輸入自己的端口號,但是,當用戶註冊後通過views/users/_new.html.erb網頁,他們只須輸入一個電子郵件地址(例如,例如@例子。 com),然後users_controller將在Account表中爲此電子郵件地址創建記錄。我的問題是,在views/accounts/_form.html.erb頁面的端口號是必需的,但在views/users/_new.html.erb不是。

有沒有驗證用戶輸入端口號的方法,如果他們在views/accounts/_form.html.erb頁面或調用accounts_controller中的create方法?

我知道我可以通過HTML進行驗證,如下所示:<%= f.text_field :port, :required => true %>但我需要添加進一步驗證以及存在,所以這不適用。

回答

3

您可以創建一個attr_accessor場,決定是否應該進行驗證...

class Account < ActiveRecord:Base 
    attr_accessor :port_needs_validation 
    validates :port, presence: true, if: -> {port_needs_validation} 

然後,只需設置訪問您的創建方法......

def create 
    @account = Account.new 
    @account.assign_attributes(account_params) 
    @account.port_needs_validation = true 
    if @account.save 
    ... 
1

提取的部分將邏輯轉換爲表單對象,查看legendary 2012 blog entry from CodeClimate。從那時起,一切都變了,筆者採用Virtus建立表單對象,比較流行的&了最新的寶石,這些天有:

如果這是一次性的事情,只是做what Steve said in the other answer但這是一個肯定的方式地獄,saf電子討厭和離婚(至少從個人經歷)在任何稍微小的weeny更大的項目(即你的意思是花更多的時間在它上面工作,這不像你剛完成一切並想回家)。

其實,只要在表格類中隨處使用,並且避免模型驗證&其他回調。在編寫測試時,您不希望發送帳戶激活郵件或驗證密碼複雜性,只需要屬於「用戶」的「帖子」。

我自己最喜歡的個人fuckup由於模型回調被髮送因爲在account_type屬性遷移一個無辜的拼寫變化更新,只是因爲account_type_changed?是真實的240.000「您的帳戶已經升級/降級」的電子郵件。

所以..形式類永遠不會,模型回調。

0

我不會建議你有model知道views。在@SteveTurczyn的解決方案中,抽象領域被引入到模型中以確定它來自哪個頁面,這是一個很好的解決方案。

由於從Ruby on Rail MVC,既ViewModel談話控制器,另一種解決方案將是通過創造價值account之前有則params的控制器手柄驗證