Ruby on rails 做双栏验证的好方法

Ruby on rails 做双栏验证的好方法,ruby-on-rails,validation,ruby-on-rails-3,Ruby On Rails,Validation,Ruby On Rails 3,这一次我使用的是Rails 3。我有一个集合模型,一个用户模型和一个中间订阅模型。这样,用户可以使用特定角色订阅多个集合。但是,我不希望用户能够订阅同一个集合两次 因此,在我的订阅模式中,我有如下内容: validate :subscription_duplicates def subscription_duplicates self.errors.add_to_base "This user is already subscribed" if Subscription.where(:us

这一次我使用的是Rails 3。我有一个集合模型,一个用户模型和一个中间订阅模型。这样,用户可以使用特定角色订阅多个集合。但是,我不希望用户能够订阅同一个集合两次

因此,在我的订阅模式中,我有如下内容:

validate :subscription_duplicates

def subscription_duplicates
  self.errors.add_to_base "This user is already subscribed" if Subscription.where(:user_id => self.user.id, :collection_id => self.collection.id)
end
然而,这看起来很丑陋。此外,当我想在我的采集控制器中执行以下操作时,它会中断:

def create
  @collection = Collection.new(params[:collection])
  @collection.subscriptions.build(:user => current_user, :role => Subscription::ROLES['owner'])
  @collection.save
  respond_with(@collection)
end
当我进行构建时,订阅没有id,因此我得到一个“Called id for nil”错误


谢谢你的指导

使用验证的唯一性

validates_uniqueness_of :user_id, :scope => :collection_id

使用验证的唯一性

validates_uniqueness_of :user_id, :scope => :collection_id

首先,您的创建操作应始终测试对象是否保存,如果未保存,则进行处理(通常通过重新呈现新建/编辑页面并向用户显示错误)

标准类型的创建操作如下所示(对于本例中的@post):


Shingara避免重复的方法对您来说应该很好。

首先,您的创建操作应该始终测试对象是否已保存,如果未保存,则进行处理(通常通过重新呈现新/编辑页面并向用户显示错误)

标准类型的创建操作如下所示(对于本例中的@post):

Shingara避免重复的方法对你来说应该很好