如何用Rails中的div包装每个选择的date_select?

时间:2012-01-02 11:46:44

标签: ruby-on-rails-3 forms html wrapper

我正在使用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,但我需要每个选择框都有自己的包装器。有什么方法可以解决这个问题吗?

任何帮助将不胜感激。感谢。

5 个答案:

答案 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) %>