在 Rails 中为 form_tag 添加命名空间
Add namespace for form_tag in Rails
我正在使用 bootstrap_form
gem 在 Rails 中生成表单。在我的表单视图中,我使用 form_tag
而不是 form_for
<%= bootstrap_form_tag url: 'metafields' do |f| %>
<%= f.hidden_field :owner_id, value: params[:owner_id] %>
<%= f.text_field :namespace, placeholder: 'Namespace of metafield' %>
<%= f.text_field :key, placeholder: 'Key of metafield' %>
<%= f.text_area :description, placeholder: 'Description about metafield' %>
<%= f.select :type, [['String', 'string']], class: 'selectpicker' %>
<% end %>
有没有一种方法可以使用包含前缀命名空间的参数提交此表单,例如 params[:metafield][:owner_id]
。
当我尝试使用
<%= bootstrap_form_tag url: 'metafields', namespace: 'metafield' do |f| %>
它生成以下输入,这不是我想要的
<input placeholder="Key of metafield" name="key" id="metafield_key" class="form-control" type="text" kl_vkbd_parsed="true">
从 this 开始,form_tag
不支持像 form_for
这样的名称空间。因此,我找到了如下解决方法,它为输入生成正确的 name
,就好像我们使用 form_for
<%= bootstrap_form_tag url: 'metafields' do |f| %>
<%= f.hidden_field :owner_id, value: @owner_id %>
<%= f.hidden_field :owner_class, value: @owner_class %>
<%= f.text_field :'metafield[namespace]', label: 'Namespace', placeholder: 'Namespace of metafield' %>
<%= f.text_field :'metafield[key]',label: 'Key', placeholder: 'Key of metafield' %>
<%= f.text_field :'metafield[value]',label: 'Value', placeholder: 'Key of metafield' %>
<%= f.select :'metafield[value_type]', [['String', 'string']], label: 'Type', class: 'selectpicker' %>
<%= f.text_area :'metafield[description]', label: 'Description', placeholder: 'Description about metafield' %>
<%= f.submit 'Submit', class: 'btn btn-outline-dark float-right' %>
<% end %>
quyetdc 的答案是一个可行的方法,除非你有动态表单,这里是一个更简洁的方法
<%= bootstrap_form_tag url: 'metafields' do |f| %>
<%= f.fields_for :metafield do |mf| %>
<%= mf.hidden_field :owner_id, value: params[:owner_id] %>
<%= mf.text_field :namespace, placeholder: 'Namespace of metafield' %>
<%= mf.text_field :key, placeholder: 'Key of metafield' %>
<%= mf.text_area :description, placeholder: 'Description about metafield' %>
<%= mf.select :type, [['String', 'string']], class: 'selectpicker' %>
<% end %>
我正在使用 bootstrap_form
gem 在 Rails 中生成表单。在我的表单视图中,我使用 form_tag
而不是 form_for
<%= bootstrap_form_tag url: 'metafields' do |f| %>
<%= f.hidden_field :owner_id, value: params[:owner_id] %>
<%= f.text_field :namespace, placeholder: 'Namespace of metafield' %>
<%= f.text_field :key, placeholder: 'Key of metafield' %>
<%= f.text_area :description, placeholder: 'Description about metafield' %>
<%= f.select :type, [['String', 'string']], class: 'selectpicker' %>
<% end %>
有没有一种方法可以使用包含前缀命名空间的参数提交此表单,例如 params[:metafield][:owner_id]
。
当我尝试使用
<%= bootstrap_form_tag url: 'metafields', namespace: 'metafield' do |f| %>
它生成以下输入,这不是我想要的
<input placeholder="Key of metafield" name="key" id="metafield_key" class="form-control" type="text" kl_vkbd_parsed="true">
从 this 开始,form_tag
不支持像 form_for
这样的名称空间。因此,我找到了如下解决方法,它为输入生成正确的 name
,就好像我们使用 form_for
<%= bootstrap_form_tag url: 'metafields' do |f| %>
<%= f.hidden_field :owner_id, value: @owner_id %>
<%= f.hidden_field :owner_class, value: @owner_class %>
<%= f.text_field :'metafield[namespace]', label: 'Namespace', placeholder: 'Namespace of metafield' %>
<%= f.text_field :'metafield[key]',label: 'Key', placeholder: 'Key of metafield' %>
<%= f.text_field :'metafield[value]',label: 'Value', placeholder: 'Key of metafield' %>
<%= f.select :'metafield[value_type]', [['String', 'string']], label: 'Type', class: 'selectpicker' %>
<%= f.text_area :'metafield[description]', label: 'Description', placeholder: 'Description about metafield' %>
<%= f.submit 'Submit', class: 'btn btn-outline-dark float-right' %>
<% end %>
quyetdc 的答案是一个可行的方法,除非你有动态表单,这里是一个更简洁的方法
<%= bootstrap_form_tag url: 'metafields' do |f| %>
<%= f.fields_for :metafield do |mf| %>
<%= mf.hidden_field :owner_id, value: params[:owner_id] %>
<%= mf.text_field :namespace, placeholder: 'Namespace of metafield' %>
<%= mf.text_field :key, placeholder: 'Key of metafield' %>
<%= mf.text_area :description, placeholder: 'Description about metafield' %>
<%= mf.select :type, [['String', 'string']], class: 'selectpicker' %>
<% end %>