Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 3 在rails 3中使用attr_访问器_Ruby On Rails 3_Validation_Attr Accessor - Fatal编程技术网

Ruby on rails 3 在rails 3中使用attr_访问器

Ruby on rails 3 在rails 3中使用attr_访问器,ruby-on-rails-3,validation,attr-accessor,Ruby On Rails 3,Validation,Attr Accessor,我一直在rails中遇到attr_访问器的一致性问题。我从来没有弄清楚我遗漏了什么细节…所以,我想我应该在这里提出一个问题 我有以下资料: ...Controller new @something = Something.new @something.it_should = true end 因此,我将控制器中的实例变量设置为true。我通过attr_访问器使该变量可用于模型。我将变量放入一个方法中,然后在验证中使用该方法。看来应该行得通。但是,它什么也不做。

我一直在rails中遇到attr_访问器的一致性问题。我从来没有弄清楚我遗漏了什么细节…所以,我想我应该在这里提出一个问题

我有以下资料:

  ...Controller
  new
     @something = Something.new
     @something.it_should = true
  end

因此,我将控制器中的实例变量设置为true。我通过attr_访问器使该变量可用于模型。我将变量放入一个方法中,然后在验证中使用该方法。看来应该行得通。但是,它什么也不做。这永远不应该是真的。页面加载正常,但未验证字段

我甚至尝试过这个…但是,它没有导致验证执行

  def should_validate?
     true
  end

使用att_访问器的诀窍是什么?

问题是,您使用
attr_访问器设置的实例变量
@it_应该
不会在请求之间持久化,因此尽管您在
新建
操作中将其设置为
true
,一旦提交表单并触发某些其他操作(可能是
创建
更新
),它将被重置

如果要以这种方式验证字段,则必须在表单提交触发的操作中设置它,例如
create

def create
  @something = Something.new(params[:something])
  @something.it_should = true
  @something.save
  ...
end

这应该会像预期的那样触发对
name
的验证。

我希望通过客户端的验证来实现条件验证。因此,让it_实例仅在新操作中持久化仍然有效。Railscasts#41讨论了此主题,我的设置与Ryans相同…但我的设置不起作用。您是否假设it#U should变量正在控制器中设置?怎么可能不呢?无论发生什么情况,用于条件验证的模型中的方法似乎都通过了false。但是,如果我跳过该方法,只执行:if=>:it_should==“random text”,那么验证的作用就好像结果为true一样。奇怪。只要看一下Railscast中的代码,他就可以在同一个控制器操作中使用行
@user.updateing_password=true
@user.save
,这会起作用(如我上面所述)。但您定义它的方式将不起作用,因为实例变量不会在请求之间传递。事实上,我刚刚观看了Railscast,我认为您误解了Ryan是如何实现此验证的。他使用
attr\u访问器
在名为
update\u password
的控制器操作中设置实例变量。但与上面所写的不同,记录保存在与实例变量设置相同的操作中,因此不存在持久性问题。我无法解释您注意到的奇怪行为,但在任何情况下,您尝试执行的操作(如您所述)都是不可能的。如果要从
new
操作触发验证,则必须通过请求发送触发器,可以通过会话变量,也可以作为查询参数。或者,您可以像Ryan那样直接在保存记录的操作中实现它(正如我上面所建议的)。
def create
  @something = Something.new(params[:something])
  @something.it_should = true
  @something.save
  ...
end