你如何获得Ruby on Rails生成的表单元素的id以供JavaScript参考?

Pau*_*der 35 javascript forms ruby-on-rails

使用form_for帮助程序和text_field调用时,Ruby on Rails将<input />为其输出的元素生成唯一的id .如何生成相同的ID以便以后包含在以后生成的JavaScript中?

<%= form_for @user do |f| %>
  <%= f.text_field :username %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

然后在页面中:

<%= javascript_tag do %>
  $('<%= id of the :username field %>').doSomethingReallyCool();
<% end %>
Run Code Online (Sandbox Code Playgroud)

Pau*_*der 22

我最终创建了一个自定义表单构建器来直接公开属性

class FormBuilder < ActionView::Helpers::FormBuilder
  def id_for(method, options={})
   InstanceTag.new( object_name, method, self, object ) \
               .id_for( options )               
  end
end

class InstanceTag < ActionView::Helpers::InstanceTag
  def id_for( options )
    add_default_name_and_id(options)
    options['id']
  end
end
Run Code Online (Sandbox Code Playgroud)

然后设置默认表单生成器

ActionView::Base.default_form_builder = FormBuilder 
Run Code Online (Sandbox Code Playgroud)

  • 在Rails 5中,“ ActionView :: Helpers :: InstanceTag”应替换为“ ActionView :: Helpers :: Tags :: Base”,而“ InstanceTag.new(object_name,method,self,object)”应为“ InstanceTag.new” (object_name,method,self,options)代替。 (2认同)

Mat*_*tti 12

查看表单构建器选项:

<%= form_for @user do |f| %>
  <% form_css_id = "#" + f.options[:html][:id] %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

选项至少应包括以下数据:css类,id,http方法和真实性标记.

  • f.options [:html]对我来说是零. (4认同)
  • 需要明确的是,OP 询问如何获取用户名字段的 id,而不是表单 id。这将返回表单 ID。 (2认同)

Dan*_*aja 6

至少在 Rails 7 中,有一个方法field_id(user, :password)可以返回user_password输入的 id。

  • 如果您使用 Rails 7,这绝对是最好的答案。 (2认同)

rod*_*amn 5

如果有人从fields_for块中获得FormBuilder 对象,则可以id使用以下代码段获取它:

<%= form.fields_for :something do |fields_form| %>
  <%= fields_form.object_name.gsub(/[\[\]]+/, '_').chop %>id
<% end %>
Run Code Online (Sandbox Code Playgroud)

FieldsForm#object_name像这样返回字段的 ID:user[address][0]。接下来,正则表达式替换将一个或多个括号的组更改为下划线。这种替换会留下一个尾随下划线,并在其上附加字母id。对于之前提供的示例,这将导致user_address_0_id.


Mic*_*ant 5

在 Rails 4.1 中,我可以通过以下方式获取 id:

ActionView::Base::Tags::Base.new(
  f.object_name,
  :username,
  :this_param_is_ignored,
).send(:tag_id)
Run Code Online (Sandbox Code Playgroud)

它适用于嵌套表单 ( fields_for)。