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时并非如此,所以这对我来说很困惑)。 自定义验证不适合我需要的吗?我需要查看过滤器还是让控制器运行它自己的验证功能?
答案 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)