2012-02-08 39 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