1

我有一個註冊過程,有兩個註冊表單,這取決於您是個人還是公司,都發布到同一模型(用戶與設計)。我正在模型中設置我的驗證,但想知道如何設置每個表單上不同的輸入字段的驗證。驗證兩種形式

例如:company_no僅在該公司報名的形式,但如果我添加驗證了這一領域的個人註冊表格將失敗,並在拋出一個錯誤:company_no場

我已經設置這些鏈接最多將用戶引導至正確的形式

<p><%= link_to 'Sign Up as Individual', new_user_registration_path %></p> 
<p><%= link_to 'Sign Up as Vets/Rescue Centre', new_user_registration_path(organization: true) %></p> 

查看

<% if params[:organization] %> 
<%= render 'shared/company_signup_form' %> 
<% else %> 
<%= render 'shared/individual_signup_form' %> 
<% end %> 

一個簡單的驗證的例子,我試圖用

class User < ActiveRecord::Base 
    validates :company_no, presence: true 
end 

任何幫助讚賞

回答

1

你可以做的是利用軌道conditional validation,做這樣的事情:

class User< ActiveRecord::Base 
    validates :company_no, presence: true, if: :record_is_company? 

    def record_is_company? 
    # check for some field which distinguish between a user and company 
    end 
end 

更新:

由於@戴夫指出如果有多個驗證要檢查,那麼要麼你可以讓non-persi的受激發射損耗模型或不使用軌道驗證方法可以使two custom validation methods然後利用validation errors添加錯誤,所以你的用戶模型將是這樣的:

class User< ActiveRecord::Base 
    validate :company_account, if: :record_is_company? 
    validate :user_account, if: :record_is_user? 

    def company_account 
    # validate company form fields and add error 
    end 

    def user_account 
    # validate user form fields and add error 
    end 

    def record_is_company? 
    # check for some field which distinguish between a user and company 
    end 

    def record_is_user? 
    # check for some field which distinguish between a user and company 
    end 
end 

更新: 我不是檢查數據庫條件的領域。如果我們使用虛擬屬性並將其設置爲形式(如您在您評論中所建議的那樣)將會更好。

attr_accessor :company_form 
validates :company_name, presence: true, if: :record_is_company? 

def record_is_company? 
    true if company_form 
end  
+1

謝謝你,所以如果我有一個隱藏字段company_form,value :: true,在record_is_company?方法,我只是把company_form? – Richlewis 2014-09-05 13:04:31

+0

@Richlewis是的,應該這樣做,但不是添加一個額外的隱藏字段,你也可以檢查字段是不同的用戶和公司。我不知道您的數據庫字段,但是您必須有一種方式來區分它是用戶記錄還是公司記錄,因此您可以檢查 – Mandeep 2014-09-05 13:11:01

+0

以及:company_name是公司註冊表單所特有的,所以嘗試驗證:company_name,presence:true,如果:: record_is_company? def record_is_company? company_name結束,但這似乎沒有工作,因爲錯誤消息正在爲每個表單拋出 – Richlewis 2014-09-05 13:18:14

2

有多種解決方案。

一個微不足道的是使用條件驗證,但這會變得混亂。

IMO最乾淨的是使用非持久模型,每個表單一個,並從它們創建用戶模型。

這將持續的(域)模型與窗體表示分離。由於Rails提倡對模型進行驗證,但沒有簡單的方法來分離上下文,創建表單模型有時比嘗試對所有事物進行條件化更麻煩和維護。當它超過一個或兩個條件時尤其如此。