0

データを送信するフォームがあり、他のすべてのフィールドが入力されているかどうかに応じて、1 つのフィールドを自動的に設定したいと考えています。それらがすべて完了している場合、フィールドは「完了」になり、そうでない場合は「下書き」に設定されます。

したがって、次のような隠しフィールドがあります。

<%= f.hidden_field :status, :value => "draft" %>

デフォルトで下書きにします。しかし、他のすべてのフィールドに入力すると「完了」するというロジックを追加できますか?

4

4 に答える 4

2

モデルの名前が foo であると仮定して、jquery を使用してクライアント側で実行する方法は次のとおりです。

<script type='text/javascript'>
  $(document).ready(function() {
    $('input[name*="otherfields"]').on('change', function() {
      var othercount = 0;
      $('input[name*="otherfields"]').each(function() {
        if ( $(this).is(':checked') )
          othercount += 1;
      });
      if ( othercount == 2 ) 
        $('#foo_status').attr('checked',true)
      else
        $('#foo_status').attr('checked',false)
    });
  });
</script>

<%= check_box_tag :item1 , '1', false, :name=>'otherfields[1]' %>    
<%= check_box_tag :item2 , '2', false, :name=>'otherfields[2]' %>
<%= f.hidden_field :status, :value => "draft" %>
于 2013-02-19T20:13:49.263 に答える
1

ステータスが変更されたときに他のクライアント側のイベントを発生させる必要がないと仮定すると、この種のビジネスロジックをコールバックとしてモデル内に配置することをお勧めします。たとえば、次のようになります(モデル名とフィールド名を置き換えFooますfieldx)。

class Foo < ActiveRecord::Base

  before_save :default_status

  def default_status
    if field1 && field2 && field3 && field4
      self.status = 'completed'
    else
       self.status = 'draft'
    end
  end

end
于 2013-02-19T20:48:29.627 に答える
1

はい、コントローラーでそれを行うことができます。

フォームが作成アクションに誘導するとしましょう。

コントローラーの作成アクションでは、すべてのフィールドが完了しているかどうかを確認してから、保存する前にステートメントをparams使用ifして適切な値を割り当てることができますstatus

于 2013-02-19T19:54:54.780 に答える
0

これは、javascript、場合によってはjQueryを使用して行われます。しかし、なぜこのように設計するのでしょうか。サーバー側でこれを行うことはできませんか?

于 2013-02-19T19:53:37.040 に答える