【问题标题】:Creating unique id for <fieldset> when using form_for Rails Nested Model Form使用 form_for Rails 嵌套模型表单时为 <fieldset> 创建唯一 ID
【发布时间】:2012-11-02 05:15:36
【问题描述】:

我有一个这种 Railscast 风格的嵌套模型表单 http://railscasts.com/episodes/196-nested-model-form-revised?view=asciicast

我需要给每个标签一个唯一的 ID。目前,生成的每个字段都有一个唯一的 ID 和名称,由帮助方法给出,该方法为每个关联记录分配一个唯一的 ID。所以这被照顾了。但是,此表单具有未分配 ID 的“fieldset”标签。出于 jQuery 操作目的,我需要每个字段集的唯一 ID。

具体来说,如何为“活动”记录生成的每个字段集赋予唯一的 CSS 标记 ID? 下面发布的是我的表单是如何创建的。谢谢

_form.html.erb

<%= form_for(@trip) do |f| %>

<%= f.fields_for :days do |builder| %>
  <%= render 'day_fields', f: builder %>
<% end %>
<%= link_to_add_fields "Add Day", f, :days %>

_day_fields.html.erb 部分

<fieldset>
  <%= f.label :summary, "Day Summary" %><br />
  <%= f.text_area :summary, :rows => 1 %><br />
    <%= link_to "remove", '#', class: "remove_fields" %>

  <%= f.fields_for :activities do |builder| %>
    <%= render 'activity_fields', f: builder %>
  <% end %>
  <%= link_to_add_fields "Add Activity", f, :activities %>
</fieldset>

_activity_fields.html.erb

<fieldset>
  <%= f.label :title, "Activity" %><br />
  <%= f.text_field :title, :rows => 1 %><br />
  <%= f.hidden_field :_destroy %>
  <%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>

【问题讨论】:

    标签: css ruby-on-rails ruby ruby-on-rails-3.2


    【解决方案1】:

    如果您使用的是 ryanb nested_form gem:

    请改用f.index。并确保在您的部分中传递每个不同的 form_builder。

    例如,如果你这样做

    <%= main_form.fields_for :nested1_items do |nested1_form| %>
        <%= render partial 'main/nested1_fields', nested1_form: nested1_form %>
    <% end %>
    

    _nested1_fields

    <fieldset id="nested1-<%= nested1_form.index %>-items">
    

    看我的回答in this question

    【讨论】:

      【解决方案2】:

      为什么不直接使用传入两个部分的f.object

      <% fieldset_id = "#{f.object.class.underscore}_#{f.object.id}" %>
      <fieldset id='<%= fieldset_id %>'>
      ...
      

      【讨论】:

      • 啊,我应该提到新的字段集是通过 Ajax 调用生成并加载的。因此,您的方法在我编辑表单时有效,但是当我创建新字段时,object.id 为空,因此这不起作用。这里有什么想法吗? @RyanBigg
      • @HungLuu ya 找到另一种方法吗?
      【解决方案3】:

      我遇到了类似的问题,我使用以秒为单位的时间来解决它,并将它传递到我需要的每个地方。

      例如:

      控制器中

      def something
        # First idea
        @dynid = Time.now.to_i
        ...
        # Second idea: store it in the session
        session[:dynid] = Time.now.to_i
        ...
      end
      

      在您的视图中

      <fieldset id="#{@dynid}">
      <!-- or in case @dynid is out of reach, then use the session[:dynid] -->
      <fieldset id="#{session[:dynid]}">
      

      session[:dynid} 仍然可以使用 ajax 呈现的代码。

      希望对你有帮助。

      【讨论】:

      • 对不起 - 我不太明白在会话中存储 session[:dynid] 的概念。我尝试将它放在 ERB 中,但它为每个添加的 ajax 表单部分生成相同的 ID。
      • 我使用session[:dynid] 来存储我可以参考的唯一编号。在您的情况下,您可以使用它来生成字段集的 ID。
      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多