2014-01-31 94 views
1

我在控制器中使用名爲add_roles的自定義操作以及具有名爲role_name的虛擬屬性的相關表單視圖。我想驗證的存在:ROLE_NAME,但它不工作:驗證是否存在虛擬屬性

這是控制器:

Class StaffsController < InheritedResources::Base 
    def roles 
    @staff=Staff.find params[:id] 
    end 

    def add_roles  
    @staff=Staff.find params[:id] 
    role_name=params[:staff][:role_name] #this field must be present 
    @staff.add_role Role.find(role_name).name 
    redirect_to staff_path(@staff) 
    end 
end 

這是模型:

class Staff < ActiveRecord::Base 
    attr_accessible :email, :name, :surname 
    attr_accessor :role_name 

    validates_presence_of :role_name 

    validate do |staff| 
    if staff.role_name.blank? 
     staff.errors[:base] << "INVALID" 
    end 
    end 
end 

這是視圖:

<%= simple_form_for @staff, url: :add_roles_staff do |f| %> 
    <%= f.input :role_name, as: :select, collection: Role.global %> 
    <%= f.button :submit %> 
<% end %> 

正確的行爲是,如果我不選擇選擇框:role_name表單顯示我一個錯誤,但現在它不工作。該表單不顯示任何錯誤。

+0

爲什麼你有ROLE_NAME兩個'attr_accessible'和'attr_accessor' ? – usha

+0

是一個錯誤。現在我刪除此條目 – user1066183

回答

1

退房員工模型,看看是否驗證工作,如果用手工觸發:

s = Staff.new 
s.valid? 
s.role_name='role' 
s.valid? 

我的猜測是,這個工程。如果是這種情況,您的驗證永遠不會觸發,可能是因爲您不保存模型(因爲您只更改虛擬屬性)。所以我的猜測只是明確觸發驗證。

但是,在你的代碼中存在這樣一個基本缺陷,驗證不起作用似乎是一個小問題:你應該明確地在數據庫上建立員工和他的角色之間的關聯。此時虛擬屬性將無法在請求/響應生命週期中存活。只要您重定向到控制器外,該更改將永遠丟失。

HTH

並順便validates_presence_of :role_name做什麼,你下面再定義:

validate do |staff| 
    if staff.role_name.blank? 
    staff.errors[:base] << "INVALID" 
    end 
end 

所以才刪除該代碼