2014-04-28 64 views
1

Rails noob,Rails使用请求参数进行自定义验证?

我想写一个自定义验证,但我依赖于来自发布请求的参数。这个例子与我所具有的相似 - 在这个后期模型中,我想验证用户是否已经发布了一些主题,但要做到这一点,我必须从帖子请求中获得主题ID:

class Post < ActiveRecord::Base 
... 
    validate :user_already_posted, on: :create 
    def user_already_posted 
     topic=Topic.where(id: params[:topicId]).first 
     //some code that runs on topic users and makes sure the user hasn't posted there 

但是,我了解到params不是全局的,模型不能访问它(我最后使用laravel的地方并非如此,所以这对我来说很困惑)。 自定义验证不适合我需要的吗?是否需要查看过滤器或让控制器运行自己的验证功能?

回答

0

我想你在这里有一点设计问题。您正在创建验证程序post,但验证本身不是关于post实例。我的意思是,模型验证器必须使用内置的默认验证器ActiveRecord或创建自定义验证器来评估所有post属性,就像您通过self访问属性一样。
我相信class method接收所有的参数和检查post创造了条件更加清晰:在控制器上的模型

类方法

def self.user_already_posted(topic_id, user_id) 
    # Do your thing 
end 

使用

can_create = Post.user_already_posted(params[:topic_id], params[:user_id) 
+0

是的,这是有道理的。 –

1

你可以这样做:

validates_uniqueness_of :user, scope: :topic_id 

可能不会恰好是你需要的,但问题是,你可以在范围内验证。 您也可以传递一个数组来验证多个参数。

validates_uniqueness_of :user, scope: [:topic_id, :post_id]