0

我的环境

Rails 3.2.1
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0]

我想根据提交值更改验证方法。

例如,在以下视图中,当推送“only_foo”时,我只想检查“foo”的验证,但是当推送“only_bar”时,我只想检查“bar”的验证。

<%= from_for(@user, :url => "/hoge/") %>
  <%= f.text_field 'foo' %>
  <%= f.text_field 'bar' %>
  <%= f.submit 'only_foo' %>
  <%= f.submit 'only_bar' %>
<% end %>

在用户模型中,我想在 validate 方法中获取提交值。

validate :foo, :presence => true, :if => :only_foo?
validate :bar, :presence => true, :if => :only_bar?

def only_foo?
  # I want to get the commit value, like this.
  commit == 'only_foo'
end

def only_bar?
  # I want to get the commit value, like this.
  commit == 'only_bar'
end

还是有更好的做法?

提前谢谢了。

4

2 回答 2

4

在定义提交按钮时,您可以将名称与它们相关联

<%= f.submit 'only_foo', name: 'foo' %>
<%= f.submit 'only_bar', name: 'bar' %>

在您的控制器操作中,params[:commit]将包含与提交关联的名称。

您也许可以将其作为虚拟属性(即名称提交)分配给 User 的实例。即在类模型中有类似的东西attr_accessor :commit

另外,不确定它是否有帮助,但您可以将其稍微重构为

更新

validates :foo, :presence => true, if: ->(u) { u.commit == 'foo'}
validates :bar, :presence => true, if: ->(u) { u.commit == 'bar'}

让我知道这是否有帮助或是否需要进一步阐述

于 2012-06-18T09:03:18.127 回答
0

您可以根据您希望的任何条件,在 .save 之前运行一个方法来检查您想要检查的内容。

于 2012-06-18T09:06:53.367 回答