1

取引のリストを持つ取引コントローラーがあります。各取引には、「勝った、負けた、保留中」を切り替えるための 3 つのラジオ ボタンが必要です。これを達成するための最良のアプローチは何ですか?

ブール型の取引テーブルに新しいエントリを作成するか、オプションごとにブール値を持つ外部キーを持つ取引テーブルに接続された別のテーブルを作成します。私は少し混乱しています..

_deal_status.html.erb

<%= form_for @deal do |f| %>

  State:
  <label>
    <%= f.radio_button :state, 'pending', :class => "radio" %>
    Pending
  </label>
  <label>
    <%= f.radio_button :state, 'won', :class => "radio" %>
    Won
  </label>
  <label>
    <%= f.radio_button :state, 'lost', :class => "radio" %>
    Lost
  </label>

<% end %>

このフォームは、ラジオ ボタンの値を除いて、元の @deal フォームを nil にリセットしています。

4

1 に答える 1

0

探しているのは状態列のようです。いくつかのブール値の列を追加すると、取引がいつでも指定された 2 つの状態になることができないため、データの重複が発生します (勝ちと負けが同時に発生することはありません)。State Machinesを調べてください。ステート マシンを使用すると、より高度な処理を実行できます。

強くお勧めしますが、ステート マシンは必要ありません。-tableに文字列列stateを追加するだけdealsで、その列を使用して各取引の状態を追跡できます。

$ rails g migration add_state_to_deals state:string

フォーム内のラジオ ボタンを取得するには、次のようにします。

<%= form_for @deal do |f| %>
  ...
  State:
  <label>
    <%= f.radio_button :state, 'pending' %>
    Pending
  </label>
  <label>
    <%= f.radio_button :state, 'won' %>
    Won
  </label>
  <label>
    <%= f.radio_button :state, 'lost' %>
    Lost
  </label>
  ...
<% end %>

そして、モデルにこの検証とデフォルト値セッターを持ってください:

class Deal < ActiveRecord::Base
  ...
  validates_inclusion_of :state, in: %w{pending won lost}
  after_initialize :set_default_state, if: :new_record?

  private

  def set_default_state
    state = 'pending'
  end
  ...
end
于 2013-08-05T10:15:55.347 に答える