Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 上的Rails验证计数限制有多个:通过_Ruby On Rails 3_Count_Limit_Has Many Through_Custom Validators - Fatal编程技术网

Ruby on rails 3 上的Rails验证计数限制有多个:通过

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 )对更新和创建都有

我有以下模型:团队、成员、任务、角色

团队模式有很多成员。每个成员在任务中都有许多角色。角色分配为队长和跑步者。我还使用会员模式安装了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,因此建议的更新将通过,新成员和角色将保存到数据库中,不会出错

成员模型:

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