如何根据rails 3.2中的提交值决定执行哪个验证?

时间:2012-06-18 08:48:53

标签: ruby-on-rails ruby-on-rails-3

我的环境

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

还是有更好的练习吗?

非常感谢提前。

2 个答案:

答案 0 :(得分: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'}

请告诉我这是否有帮助,或者是否需要进一步阐述

答案 1 :(得分:0)

您可以在.save之前使用旧学校方法运行方法,根据您希望的任何条件检查您要检查的内容。