Rails自定义验证请求参数?

时间:2014-04-28 19:46:54

标签: ruby-on-rails ruby ruby-on-rails-4

Rails noob,

我正在尝试编写自定义验证,但我依赖于来自post请求的参数。这个例子类似于我所拥有的 - 在这个帖子模型中我想验证一个用户还没有发布某个主题,但为了做到这一点,我必须从帖子请求中获得主题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时并非如此,所以这对我来说很困惑)。 自定义验证不适合我需要的吗?我需要查看过滤器还是让控制器运行它自己的验证功能?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

validates_uniqueness_of :user, scope: :topic_id

可能不是您需要的,但关键是您可以在范围内进行验证。 您还可以传递数组以验证多个参数。

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

答案 1 :(得分:0)

我认为你在这里遇到了一些设计问题。您正在创建post验证程序,但验证本身与post实例无关。我的意思是,模型验证器必须使用内置post的默认验证器或者像您一样创建自定义验证器来评估所有ActiveRecord属性,通过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)