0

这不像我想要的那样工作。

我有一份工作的报名表,它由多个步骤组成。默认情况下,每个作业填充4 个新的和未保存的步骤。

使用下面视图中的代码,我可以将 jQuery UI datepicker 控件附加到文本字段,当我单击它们时,它们会出现在正确的输入字段中。

但是,当我从选择器中选择一个日期时,它只会进入代表第一步开始日期的字段。

<%= form_for @job, :url => jobs_path do |f| %>
    <%= f.label :name %>
    <%= f.text_field :name %>

    <% @job.steps.each do |step| %>
        <%= fields_for "job[step_attributes][]", step do |s| %>
            <%= s.label :name %>
            <%= s.text_field :name %>

            <%= s.label :start_date %>
            <%= s.text_field :start_date, :class => :datepicker %>
        <%= end %>
<% end %>

<script type="text/javascript">
    $(function() {
        $('.datepicker').datepicker({ dateFormat: "dd/mm/yy"});
    });
</script>

我知道最终这与id输入元素的生成属性相同有关,想知道是否有人成功克服了这个问题?

这个小提琴: http: //jsfiddle.net/twilson/u9m9L/演示了我的问题。

4

1 回答 1

1

首先,fields_for改为在您的表单构建器上调用:

<%= f.fields_for :steps do |s| %>

其次,@job.steps如果将关联名称指定为fields_for. 这里有一个关于如何将其与一对多关联一起使用的示例。

如果还是有这个问题,把你生成的 HTML 贴上去,这样更容易找到原因。

编辑

好的,所以问题是因为 Rails 表单构建器不会生成子索引来为嵌套字段集提供唯一 ID。这很可能是因为关联已建立但尚未保存到数据库。我看到的一种方法是手动分配子索引,如下所示:

<% @job.steps.each_with_index do |step,i| %>
  <%= f.fields_for :steps, step, :child_index => i do |s| %>

看看是否有帮助。

这是一个有点做作的场景,因为您只有新对象。为了能够动态添加/删除嵌套项,这会有点棘手。您可以在嵌套模型 Railscasts中看到如何处理这个问题。

于 2012-07-13T10:37:04.580 回答