我正在使用Ruby on Rails 3为用户创建表单,在那里他可以保存他的生日。控制器和模型周围的所有操作都可以正常工作。但是我对这种形式的造型有困难。
对于我表单中的每个选择,我在它周围包裹一个div,来设计它,通常效果很好。 date_select
的问题在于它会生成三个选择框,这些框全部包含在一个div中。作为Haml的示例,该字段的代码如下所示:
.select-wrapper
= f.date_select :birthday, :start_year => Time.now.year - 120, :end_year => Time.now.year
.select_wrapper
在所有三个选择框周围创建一个div,但我需要每个选择框都有自己的包装器。有什么方法可以解决这个问题吗?
任何帮助将不胜感激。感谢。
答案 0 :(得分:9)
方法1(困难)
重写date_select
代码以便为您处理此特殊实例:https://github.com/rails/rails/blob/master/actionview/lib/action_view/helpers/date_helper.rb#L283
方法2(简单)
使用jQuery:
// Find all select boxes that have an ID attribute containing "birthday"
// and wrap a div tag around them with a certain class
$('select[id*="birthday"]').wrapAll('<div class="select_wrapper">');
答案 1 :(得分:8)
我正在使用涉及参数:date_separator
的解决方案。
有点像这样:
.select-wrapper
= f.date_select :birthday, :start_year => Time.now.year - 120, :end_year => Time.now.year, :date_separator => '</div><div class="select-wrapper">'
答案 2 :(得分:5)
这不是最漂亮的,但对我来说效果很好......
<div class="small-4 columns"><%= f.date_select :release_date, {date_separator: "</div><div class='small-4 columns'>"} %></div>
<div class="small-4 columns"></div>
是我想要包装的所有内容。基本上只是确保date_separator是关闭我的标签并打开下一个标签,并确保打开我的第一个标签在date_select之前,我的最后一个标签的关闭是在date_select之后。
答案 3 :(得分:0)
在How to let custom FormBuilder wrap datetime_select's selects in e.g. a div?我基本上面临同样的问题。
JavaScript对我来说不是一个选项,date_separator
黑客是......一个黑客:)
我提出了以下解决方案(适用于我,在HAML中)。我认为到目前为止它是最干净的解决方案,但依赖于一些Rails内部。
- date_time_selector = ActionView::Helpers::DateTimeSelector.new(Time.current,
{ prefix: @usage.model_name.param_key,
field_name: :starttime.to_s,
include_position: true })
.select
= date_time_selector.select_year
.select
= date_time_selector.select_month
.select
= date_time_selector.select_day
.select
= date_time_selector.select_hour
.select
= date_time_selector.select_minute
您需要做的就是调整prefix
(我的情况为@usage
)和field_name
(属性名称,@usage.starttime
/ starttime
我的情况)。
在这个例子中,我将相应的日期字段包装在“select”类的div中。
作为参考,还有更多选项可供使用,以下是相关代码的链接:
答案 4 :(得分:0)
我遇到了类似的问题,但是我希望每个选择框都有自己的类。
这就是我所做的(使用ERB而不是HAML):
dt[, Equal := abs(GRP_Mean - M) < 1e-10 |!is.na(M)]
然后,我可以使用适当的类将每个类包装在div中,但是您也可以将类直接添加到选择标签中,如下所示:
<%= select_month(@person.birthday, field_name: "birthday(2i)", prefix: "person", prompt: true) %>
<%= select_day(@person.birthday, field_name: "birthday(3i)", prefix: "person", prompt: true) %>
<%= select_year(@person.birthday, field_name: "birthday(1i)", prefix: "person", start_year: Date.today.year, end_year: 1905, prompt: true) %>