2012-02-08 68 views
0

我有模型用户和组,以及使用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 

回答

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' 
1

添加控制器代码添加以下到您的组型号:

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

的验证是要求你插入到所有表。

编辑:

更改您的控制器是这样的:

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

你不会得到所谓的零错误了的ID。如果@group为零,则会员资格中的验证将在保存尝试中进行验证。

+0

这是验证输入组名,我想在我的会员制模式的一些验证,就好像我发布一个空的文本框,或文本框中有一个不存在的名称,它会失败,并出现错误:被调用的ID为零,这将错误地为4 - 如果你真的想要的ID为零,请使用object_id – Norto23 2012-02-08 22:07:47

+0

好吧,我现在明白了。你可以发布控制器代码吗? – 2012-02-09 15:50:51

+0

已经增加了create方法的控制器代码,谢谢。 – Norto23 2012-02-09 21:35:11