【问题标题】:Rails Check Box - Allowing User To Choose Days Off The WeekRails 复选框 - 允许用户选择一周的休息日
【发布时间】:2013-03-27 07:31:13
【问题描述】:

我有一个模型名称“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>

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

我是否必须在一周中的每一天为模型添加一个字符串,还是有更简单的选择?谢谢。

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

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    如果我理解正确,您可能希望创建一个 :day 属性(字符串可能最简单),然后使用 Radio Buttons(而不是复选框)让用户只选择其中一个选项。

    你的视图看起来像这样:

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

    或者,您可以使用select tag,如下所示:

    <%= 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 属性更改为数组之外,您无需做任何事情。

    【讨论】:

    • 我实际上希望用户检查他们希望交易可用的天数。 (可以是一天或多天)
    • 是的,这就是我想做的,但我想看看是否有更好的方法。非常感谢!
    • 是的。我希望有更好的方法,但我找不到它。
    【解决方案2】:

    我认为你的观点大部分是正确的。我怀疑错误出在您的控制器中。如果您可以发布控制器的代码,这可能有助于我们识别问题,但我会提供一种可能的解决方案。

    使用您拥有的代码,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
    

    我目前无法对此进行测试,因此请将其视为伪代码,希望能帮助您朝着正确的方向前进。

    【讨论】:

    • 我用控制器更新了我的问题。我必须添加一些东西吗?
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多