验证虚拟属性的存在

时间:2014-01-31 00:41:30

标签: ruby-on-rails ruby simple-form

我在控制器中有一个名为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表单显示错误,但现在它不起作用。表单没有显示任何错误。

1 个答案:

答案 0 :(得分:2)

查看我们的员工模型,看看如果手动触发验证是否有效:

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

所以只需删除该代码