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]、に送信に関連付けられた名前が含まれます。

おそらく、それを仮想属性(つまり、名前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 に答える