我在控制器中有一个名为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 :(得分: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
所以只需删除该代码