用户和组加入模型验证

时间:2012-02-08 08:04:17

标签: ruby-on-rails-3

我有模型User和Group,以及使用has_many:through方法的连接表Membership。在我的连接表的表单中,我希望用户输入管理员创建的有效组名,以成为该组的成员。

我已经得到了输入有效名称的情况但现在我需要一些验证,如果他们输入一个空白文本框,或者输入的组名存在于数据库中,我想要一些很好的错误消息。我认为这可以通过一些验证方法来实现吗?

会员资格部分 _form.html.erb

<%= form_for(@membership) do |f| %>
  <% if @membership.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@membership.errors.count, "error") %> prohibited this membership from being saved:</h2>

      <ul>
      <% @membership.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :group %><br />
    <%= f.text_field :group %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

membership.rb

class Membership < ActiveRecord::Base
  belongs_to :group
  belongs_to :user

  attr_accessible :user_id, :group_id

  validates_uniqueness_of :group_id, :message => "can be only joined once", :scope => 'user_id'
  validates_presence_of :group, :user
end

group.rb

class Group < ActiveRecord::Base

  has_many :memberships, :dependent => :destroy
  has_many :users, :through => :subscriptions

  validates :name, :presence => true, :uniqueness => true

  attr_accessible :name, :expiry
end

因此,如果验证发生的方式需要一些方向,因为成员资格和组模型中的上述验证不起作用,我得到空文本框或名称不在数据库中的错误......

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

编辑:添加控制器代码

  def create
    @group = Group.find_by_name(params[:membership][:group])
    @membership = current_user.memberships.build(:group_id => @group.id)

    respond_to do |format|
      if @membership.save
        format.html { redirect_to membership_url, :notice => 'Membership was successfully created.' }
        format.json { render :json => @membership, :status => :created, :location => @membership }
      else
        format.html { render :action => "new" }
        format.json { render :json=> @membership.errors, :status => :unprocessable_entity }
      end
    end
  end

2 个答案:

答案 0 :(得分:1)

将以下内容添加到您的群组模型中:

validate_uniqueness_of :name, :message => "a group already exists with that name"
validate_presence_of :name

为您要插入的所有表调用验证。

编辑:

按照以下方式更改您的控制器:

@membership = current_user.memberships.build(:group => @group)

你将不再获得在nil错误上调用的id。如果@group为nil,则会员资格中的验证将在保存尝试时获取。

答案 1 :(得分:0)

我通过将文本输入框更改为选择字段来解决此问题,并将向模型添加密码字段以解决我的不受欢迎用户加入群组的问题。

  def create
    @groups = Group.current
    @group = Group.find_by_name(params[:membership][:group])
    @membership = current_user.memberships.build(:group_id => @group.id)

之后我的模型验证工作现在在

之下
  validates_uniqueness_of :group_id, :message => "can be only be joined once", :scope => 'user_id'