Ruby on rails 3 Rails复选框-允许用户选择每周休息几天

Ruby on rails 3 Rails复选框-允许用户选择每周休息几天,ruby-on-rails-3,Ruby On Rails 3,我有一个模型名“Deal”和一个名为“Days”的字符串。我希望能够允许我的用户选择交易可用的天数。可以是一天(星期一),也可以是几天(星期一、星期三、星期五……),我该怎么做 我试过这个: <div class="field"> <%= f.label :monday %> <%= f.check_box :days, {}, "monday", "monday" %> </div> <div class="field"&

我有一个模型名“Deal”和一个名为“Days”的字符串。我希望能够允许我的用户选择交易可用的天数。可以是一天(星期一),也可以是几天(星期一、星期三、星期五……),我该怎么做

我试过这个:

<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>

但它覆盖了仅显示“星期二”的第一个选项

我是否必须为一周中的每一天向模型添加字符串,或者是否有更简单的选项?谢谢

交易\u控制器:

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
class DealsController
deal.rb

class Deal < ActiveRecord::Base
    belongs_to :user    
    attr_accessible :title, :description, :days
end
class-Deal
如果我理解正确,您可能希望创建一个:day属性(字符串可能最简单),然后使用(而不是复选框)允许用户只选择其中一个选项

您的视图如下所示:

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

或者,您也可以使用类似以下的

<%= f.select_tag(:day, [['Monday', 'Monday'], ['Tuesday', 'Tuesday], ...]) %>
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

我认为你的观点基本上是正确的。我怀疑错误在你的控制器里。如果您可以发布控制器的代码,这可能有助于我们识别问题,但我将提供一个可能的解决方案

使用您拥有的代码,Rails将把字段解析为类似于
params[:deal][:days]
的散列。该散列将保存一个表示天数的值数组。在走得太远之前,我认为您的代码中有一个错误。复选框函数的原型是

check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
您为
已检查的\u值
未检查的\u值
提供了相同的值。让我们修复它并将其更改为

<%= f.check_box :days, {}, "tuesday", "" %>
在控制器中,可以循环此数组并将其指定给模型

deal.days.clear
params[:deal][:days].each do |day|
  deal.days << day if day.present?
end
deal.days.clear
参数[:交易][:天]。每做一天|

deal.days我实际上希望用户检查他们希望交易可用的天数。(可能是一天或几天)是的,这就是我想做的,但我想看看是否有更好的方法。不过非常感谢!是 啊我希望有更好的方法,但我很难找到。我用控制器更新了我的问题。我需要加些什么吗?
<%= 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