Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 用于验证目的的动态查找器方法_Ruby On Rails_Ruby_Ruby On Rails 3_Validation_Constants - Fatal编程技术网

Ruby on rails 用于验证目的的动态查找器方法

Ruby on rails 用于验证目的的动态查找器方法,ruby-on-rails,ruby,ruby-on-rails-3,validation,constants,Ruby On Rails,Ruby,Ruby On Rails 3,Validation,Constants,我使用的是RubyonRails3.0.7,我希望在运行时查找一些记录以进行验证,但要传递\设置该查找器方法的值。也就是说,在我的课堂上,我有以下几点: class Group < < ActiveRecord::Base validates :relation_id, :presence => true, :inclusion => { :in => ... # Read below for more information a

我使用的是RubyonRails3.0.7,我希望在运行时查找一些记录以进行验证,但要传递\设置该查找器方法的值。也就是说,在我的课堂上,我有以下几点:

class Group <  < ActiveRecord::Base
  validates :relation_id,
    :presence  => true,
    :inclusion => {
      :in => ... # Read below for more information about
    }
end
它可以工作,但是我想为finder方法设置“一些动态的东西”,而不是下面示例中所述的
1
值。也就是说,为了以某种方式传递给模型a,我想执行如下操作:

class Group <  < ActiveRecord::Base
  validates :relation_id,
    :presence  => true,
    :inclusion => {
      :in => User.find(<test_value>).group_ids
    }
end
类组<true,
:包含=>{
:in=>User.find().group\u id
}
结束
可能吗?如果是,如何将值传递给常量


附言:我只是想知道,我试图这样做是为了将一些逻辑从控制器移动到模型。

看起来您希望为验证程序运行一个类似于:in属性的过程。我认为,当您依赖于模型的加载顺序并使用“动态常量”时,您可能处于危险区域

相反,如何为这种情况构建您自己的自定义验证器?
这并不难,你可以完全控制自己的需要:

我推断您要做的是强制执行类似“只有属于组成员的用户才能保存它”的操作。如果是这种情况,您的行为应该保留在控制器中

您的模型无法访问当前会话,添加此逻辑将阻止您在将来将模型用于其他用途。例如,您永远无法从与用户无关的批处理或维护作业中保存组

如果您真的想这样做,您可以将
当前用户
类级别变量放入
用户
对象中,并在
过滤器之前设置它

class ApplicationController
  before_fitler :set_current_user
  def set_current_user
    User.current_user = #however you get your user in your controllers
  end
end

class User
  @@current_user
end

class Group
  validates :user_in_group
  def user_in_group
    return true unless User.current_user #if we don't have a user set, skip validation
    User.current_user.group_ids.include? self.id
  end
end

您应该记住计算该常数的上下文。将在Rails加载其所有类和模型时对其进行评估。您要传递的值在该点可用吗?另外,动态常量更像是方法或类变量。@jaredonline-你说得对。我更新了这个问题。好的,你是对的,但是使用自定义验证器我无法解决在运行时传递\设置
的问题,除非我为组类\模型添加一个新的数据库表列(例如,名为
user\u id
),然后使用自定义验证器,我使用
self.user\u id
user.find(self.user\u id).group\u id
访问该值。然而,我认为我不能仅仅为此目的创建一个表列。。。我明白了,这一定是处理这个问题的更好办法。好的..为此制作一个类变量怎么样?你可以在任何你喜欢的地方设置。即
Group.test\u value=xyz
。然后在您的自定义验证器中,您可以执行
User.find(Group.test\u value).Group\u id
…也许这样做会更好?也许这是个好主意,但很难设置该值,因为我正在使用RoR方法
更新\u属性
保存
验证关联模型。要做到这一点,很可能有一种策略可以实现我想做的事情,但我不知道。Glick—“只有作为组成员的用户才能保存它。”没错!!!-甚至“你的方式”也是解决问题的另一个好方法,是不是有点太复杂了?顺便说一句:如果这些行为应该留在控制器中,我必须在所有涉及的操作方法中重复相关代码。在我看来,这不是一个模型验证问题(?),而是应用程序的用户界面或行为问题。即,当用户试图保存组时,该用户必须属于该组。这是一个UI问题,我不会对此使用验证。验证旨在验证保存的模型是否处于有效状态,它与保存模型的人员无关。你必须重新思考你的问题。你到底想在这里做什么?这将变成一个冗长的讨论,但我可能会在组中添加一个名为
save\u by\u user(user)
的方法,然后你在那里执行签入。然后在您的UI(控制器)中,无论何时需要此检查,您都可以使用此方法保存模型,而不是通常的
保存
。这样做更有意义,当你从现在起两个月后阅读它并想知道你当时写了什么时,在你的应用程序中破译的“魔力”要小得多:)@Casper-我有一个复选框字段,用户可以选择其中一个或多个值(即组),为了保存组关系,我使用“魔力”\“自动的”RubyonRails“有许多集合\u单个\u ID”(有关更多信息,请参阅)。正如您所说,我希望“只有作为组成员的用户才能保存它”,并且我希望将此逻辑转换为模型验证方法。如果我使用
save\u by_user(user)
方法,我应该在其中插入此(控制器、模型等)?
class ApplicationController
  before_fitler :set_current_user
  def set_current_user
    User.current_user = #however you get your user in your controllers
  end
end

class User
  @@current_user
end

class Group
  validates :user_in_group
  def user_in_group
    return true unless User.current_user #if we don't have a user set, skip validation
    User.current_user.group_ids.include? self.id
  end
end