我有一个型号名称“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
答案 0 :(得分:0)
如果我理解正确,你可能想要创建一个: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属性更改为数组之外,您无需执行任何操作。
答案 1 :(得分:0)
我认为你的观点大多是正确的。我怀疑错误在你的控制器中。如果您可以发布控制器的代码,这可能有助于我们确定问题,但我会提供一种可能的解决方案。
使用您拥有的代码,Rails会将字段解析为params[:deal][:days]
之类的哈希值。该哈希将包含表示日期的数组值。在走得太远之前,我认为您的代码中存在错误。 check_box函数的原型是
check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
您为checked_value
和unchecked_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
我目前无法对此进行测试,因此将其视为伪代码,希望能让您朝着正确的方向前进。