0

モデル名は「Deal」、文字列は「Days」です。取引が利用できる日数をユーザーが選択できるようにしたいと思います。1日(月曜日)または複数日(月曜日、水曜日、金曜日...)の場合があります。これを行うにはどうすればよいですか?

私はこれを試しました:

<div class="field">
    <%= f.label :monday %>
    <%= f.check_box :days, {}, "monday", "monday" %>
</div>

<div class="field">
   <%= f.label :tuesday %>    
   <%= f.check_box :days, {}, "tuesday", "tuesday" %>
</div>

ただし、「火曜日」のみを表示する最初のオプションを上書きします。

毎日のようにモデルに文字列を追加する必要がありますか、それとももっと簡単なオプションがありますか?ありがとう。

Deals_controller:

class DealsController < ApplicationController

def index
  @deals = Deal.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @deals }
  end
end

def show
  @deal = Deal.find(params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @deal }
  end
end

def create
  @deal = Deal.new(params[:deal])
  @deal.created_at = Time.now
  @deal.user = current_user

  respond_to do |format|
    if @deal.save
      format.html { redirect_to @deal, notice: 'Deal was successfully created.' }
      format.json { render json: @deal, status: :created, location: @deal }
    else
      format.html { render action: "new" }
      format.json { render json: @deal.errors, status: :unprocessable_entity }
    end
  end
end
end

Deal.rb

class Deal < ActiveRecord::Base
    belongs_to :user    
    attr_accessible :title, :description, :days
end
4

2 に答える 2

0

私が正しく理解している場合は、おそらく:day属性(文字列がおそらく最も簡単です)を作成してから、(チェックボックスではなく)ラジオボタンを使用して、ユーザーがオプションの1つだけを選択できるようにします。

ビューは次のようになります。

<div class="field">
    <%= f.label :day, "Choose the day:" %>
    <%= f.radio_button :day, "monday", "tuesday", "wednesday" %>
</div>

または、次のようにselectタグを使用することもできます。

<%= f.select_tag(:day, [['Monday', 'Monday'], ['Tuesday', 'Tuesday], ...]) %>

私は正しい質問に答えていますか?

うーん編集。これまで試したことはありません。ユーザーが数日を選択できるようにする場合は、毎日attr_accessor変数の束を作成し、それらのそれぞれにチェックボックスを作成してから、モデルのコントローラーまたはbefore_validateアクションで更新するのが最も簡単な場合があります。モデル(配列)の:days属性を使用して、チェックされたすべての日を配列に追加します。そのモデルメソッドの厄介なバージョンは次のようになります。

attr_accessible :days, ...
attr_accessor :monday, :tuesday, :wednesday...

before_validation :update_days

def update_days
  day_array = []

  day_array << "Monday" if self.monday == true
  day_array << "Tuesday" if self.tuesday == true
  ...

  self.update_attribute(:days, day_array)
end

次に、ビューで、一時属性ごとに個別のチェックボックスを設定します。

<div class="field">
    <%= f.label :monday %>
    <%= f.check_box :monday %>
</div>
<div class="field">
    <%= f.label :tuesday %>
    <%= f.check_box :tuesday %>
</div>

単なる日記号の配列である日ヘルパーをapplication_helperに作成することもできるので、次のようにすることができます。

<% days_of_the_week.each do |day| %>
    <div class="field">
        <%= f.label day %>
        <%= f.check_box day %>
    </div>
<% end %>

繰り返しを避けるため。

繰り返しになりますが、最もクリーンな方法ではありませんが、days属性を配列に変更する以外に何もしなくても、それでうまくいくと思います。

于 2013-03-26T21:44:15.533 に答える
0

あなたの見方はほとんど正しいと思います。コントローラにエラーがあると思われます。コントローラのコードを投稿できれば、問題の特定に役立つ可能性がありますが、考えられる解決策を1つ紹介します。

あなたが持っているコードで、Railsはフィールドをのようなハッシュに解析しますparams[:deal][:days]。そのハッシュは、日を表す値の配列を保持します。行き過ぎる前に、コードにエラーがあると思います。check_box関数のプロトタイプは次のとおりです。

check_box(method, options = {}, checked_value = "1", unchecked_value = "0")

とに同じ値を指定checked_valueunchecked_valueました。それを修正して、次のように変更しましょう

<%= f.check_box :days, {}, "tuesday", "" %>

そうすると、コントローラーが受け取る値は次のようになると思います

params[:deal][:days] == ['', 'Monday', 'Tuesday', '', '', 'Friday', '']

コントローラでは、この配列をループしてモデルに割り当てることができます。

deal.days.clear
params[:deal][:days].each do |day|
  deal.days << day if day.present?
end

現時点ではこれをテストできないため、正しい方向に進むことができる疑似コードとして扱ってください。

于 2013-03-26T22:31:19.447 に答える