2014-01-31 97 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 

所以才删除该代码