Ruby on rails 3 上的Rails验证计数限制有多个:通过
我有以下模型:团队、成员、任务、角色 团队模式有很多成员。每个成员在任务中都有许多角色。角色分配为队长和跑步者。我还使用会员模式安装了Desive和CanCan 我需要做的是限制每个队最多有1名队长和5名跑步者 我发现了这一点,在进行了一些定制之后,它似乎可以正常工作,但需要更新(“teams/1/members/4/edit”)。它不适用于create('teams/1/members/new')。但是我的另一个验证(验证:role\u id,:presence=>true )对更新和创建都有效。任何帮助都将不胜感激 更新:我发现这似乎与我的问题相似,但我似乎无法使其适用于我的应用程序 问题的根源似乎在于验证之前和期间如何执行计数(或大小) 例如: 更新记录时。。。 它检查团队中有多少跑步者,并返回计数。(即5)然后,当我选择要添加到成员的角色时,它将从数据库中获取已知计数(即5),并添加建议的更改(即1),然后运行验证检查。(Team.find(self.Team_id).members.runner.count>5)这可以正常工作,因为它返回的值为6且6>5,因此建议的更新失败而不保存,并给出错误 但是当我尝试在团队中创建新成员时。。。 它检查团队中有多少跑步者,并返回计数。(即5)然后,当我选择要添加到成员中的角色时,它将从数据库中获取已知计数(即5),然后运行验证检查,而不考虑建议的更改。这不起作用,因为它返回的值为5 known runner,5=5,因此建议的更新将通过,新成员和角色将保存到数据库中,不会出错 成员模型:Ruby on rails 3 上的Rails验证计数限制有多个:通过,ruby-on-rails-3,count,limit,has-many-through,custom-validators,Ruby On Rails 3,Count,Limit,Has Many Through,Custom Validators,我有以下模型:团队、成员、任务、角色 团队模式有很多成员。每个成员在任务中都有许多角色。角色分配为队长和跑步者。我还使用会员模式安装了Desive和CanCan 我需要做的是限制每个队最多有1名队长和5名跑步者 我发现了这一点,在进行了一些定制之后,它似乎可以正常工作,但需要更新(“teams/1/members/4/edit”)。它不适用于create('teams/1/members/new')。但是我的另一个验证(验证:role\u id,:presence=>true )对更新和创建都有
class Member < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
attr_accessible :password, :password_confirmation, :remember_me
attr_accessible :age, :email, :first_name, :last_name, :sex, :shirt_size, :team_id, :assignments_attributes, :role_ids
belongs_to :team
has_many :assignments, :dependent => :destroy
has_many :roles, through: :assignments
accepts_nested_attributes_for :assignments
scope :runner, joins(:roles).where('roles.title = ?', "Runner")
scope :captain, joins(:roles).where('roles.title = ?', "Captain")
validate :validate_runner_count
validate :validate_captain_count
validates :role_ids, :presence => true
def validate_runner_count
if Team.find(self.team_id).members.runner.count > 5
errors.add(:role_id, 'Error - Max runner limit reached')
end
end
def validate_captain_count
if Team.find(self.team_id).members.captain.count > 1
errors.add(:role_id, 'Error - Max captain limit reached')
end
end
def has_role?(role_sym)
roles.any? { |r| r.title.underscore.to_sym == role_sym }
end
end
类成员:销毁
有多个:角色,通过::分配
接受指定的\u嵌套\u属性\u
作用域:runner,联接(:角色)。其中('roles.title=?',“runner”)
范围:船长,加入(:角色)。其中('roles.title=?',“船长”)
验证:验证\u跑步者\u计数
验证:验证船长计数
验证:role_id,:presence=>true
def验证\u跑步者\u计数
如果Team.find(self.Team_id).members.runner.count>5
错误。添加(:角色\u id,“错误-达到最大运行者限制”)
结束
结束
def验证_机长_计数
如果Team.find(self.Team_id).members.captain.count>1
错误。添加(:角色\u id,“错误-达到最大队长限制”)
结束
结束
def具有角色?(角色符号)
有吗?{| r | r.title.下划线.to_sym==role_sym}
结束
结束
成员控制员:
class MembersController < ApplicationController
load_and_authorize_resource :team
load_and_authorize_resource :member, :through => :team
before_filter :get_team
before_filter :initialize_check_boxes, :only => [:create, :update]
def get_team
@team = Team.find(params[:team_id])
end
def index
respond_to do |format|
format.html # index.html.erb
format.json { render json: @members }
end
end
def show
respond_to do |format|
format.html # show.html.erb
format.json { render json: @member }
end
end
def new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @member }
end
end
def edit
end
def create
respond_to do |format|
if @member.save
format.html { redirect_to [@team, @member], notice: 'Member was successfully created.' }
format.json { render json: [@team, @member], status: :created, location: [@team, @member] }
else
format.html { render action: "new" }
format.json { render json: @member.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @member.update_attributes(params[:member])
format.html { redirect_to [@team, @member], notice: 'Member was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @member.errors, status: :unprocessable_entity }
end
end
end
def destroy
@member.destroy
respond_to do |format|
format.html { redirect_to team_members_url }
format.json { head :no_content }
end
end
# Allow empty checkboxes
# http://railscasts.com/episodes/17-habtm-checkboxes
def initialize_check_boxes
params[:member][:role_ids] ||= []
end
end
类成员控制器:团队
筛选前:获取团队
在\u筛选器:初始化\u复选框之前,:only=>[:create,:update]
def get_团队
@team=team.find(参数[:team\u id])
结束
def索引
回应待办事项|格式|
format.html#index.html.erb
format.json{render json:@members}
结束
结束
def秀
回应待办事项|格式|
format.html#show.html.erb
format.json{render json:@member}
结束
结束
def新
回应待办事项|格式|
format.html#new.html.erb
format.json{render json:@member}
结束
结束
定义编辑
结束
def创建
回应待办事项|格式|
如果@member.save
format.html{将_重定向到[@team,@member],注意:'成员已成功创建。}
format.json{render json:[@team,@member],状态::已创建,位置:[@team,@member]}
其他的
format.html{呈现操作:“新建”}
format.json{render json:@member.errors,status::unprocessable_entity}
结束
结束
结束
def更新
回应待办事项|格式|
如果@member.update_属性(参数[:member])
format.html{将_重定向到[@team,@member],注意:'成员已成功更新。}
format.json{head:no_content}
其他的
format.html{呈现操作:“编辑”}
format.json{render json:@member.errors,status::unprocessable_entity}
结束
结束
结束
def销毁
@毁灭
回应待办事项|格式|
format.html{重定向到团队成员\u url}
format.json{head:no_content}
结束
结束
#允许空复选框
# http://railscasts.com/episodes/17-habtm-checkboxes
def初始化复选框
参数[:成员][:角色_ID]| |=[]
结束
结束
_形成局部
<%= form_for [@team, @member], :html => { :class => 'form-horizontal' } do |f| %>
#...
# testing the count...
<ul>
<li>Captain - <%= Team.find(@member.team_id).members.captain.size %></li>
<li>Runner - <%= Team.find(@member.team_id).members.runner.size %></li>
<li>Driver - <%= Team.find(@member.team_id).members.driver.size %></li>
</ul>
<div class="control-group">
<div class="controls">
<%= f.fields_for :roles do %>
<%= hidden_field_tag "member[role_ids][]", nil %>
<% Role.all.each do |role| %>
<%= check_box_tag "member[role_ids][]", role.id, @member.role_ids.include?(role.id), id: dom_id(role) %>
<%= label_tag dom_id(role), role.title %>
<% end %>
<% end %>
</div>
</div>
#...
<% end %>
{:class=>'form horizontal'}do | f |%>
#...
#正在测试计数。。。
- 船长-
- 跑步者-
- 司机-
#...
试试看
类成员5
错误。添加(:角色\u id,“错误-达到最大运行者限制”)
结束
结束
def验证_机长_计数
如果self.team.members.captain.count>1
错误。添加(:角色\u id,“错误-达到最大队长限制”)
结束
结束
结束
我尝试了这个解决方案,虽然它确实有效,但它仍然只在更新时有效,在创建时无效。谢谢你的努力。注意:我对发布的原始模型做了一个小改动,以修复一个错误。使用.size而不是.count
class Member < ActiveRecord::Base
...
def validate_runner_count
if self.team.members.runner.count > 5
errors.add(:role_id, 'Error - Max runner limit reached')
end
end
def validate_captain_count
if self.team.members.captain.count > 1
errors.add(:role_id, 'Error - Max captain limit reached')
end
end
end