【问题标题】:HTML input type=submit won't fire in rails app when very similar button works?当非常相似的按钮工作时,HTML input type=submit 不会在 Rails 应用程序中触发?
【发布时间】:2014-07-01 14:16:05
【问题描述】:

环境是 Ruby 2.0.0、Rails 4.0.3、Windows 8.1、Simple Form、IE 或 Firefox。

我无法让 HTML 输入 type=submit 在编辑操作中触发。新动作几乎相同,并且始终如一地工作。在这种情况下,我已经消除了表单上几乎所有的输入和子菜单,以简化这个特定的问题。

当我单击新操作中的提交按钮时,它会触发控制器创建操作。当我单击编辑操作中的提交按钮时,实际上没有任何反应。任何操作的日志或客户端控制台中都不会出现任何跟踪信息。不会触发控制器更新操作。在这两种情况下,断点都表明@car 引用了适当的汽车对象。

我使用标准 HTML 进行提交,因为表单按钮从不与我正在构建的复杂菜单一起使用。我使用表单属性将按钮与表单相关联,并进行了三次检查以确保 HTML 输入标记中指定的表单与表单中的表单匹配,无论是 new_car 还是 edit_car。

控制器动作是:

  def edit
    @car = Car.find(params[:id])
  end
  def new
    @car = Car.new
  end

路由定义使用:

  resources :cars

new.html.erb:

<div class="row">
  <%= render partial: 'new', layout: 'layouts/sf_label', locals: { title: 'New Car' } %>
</div>

edit.html.erb:

<div class="row">
  <%= render partial: 'edit', layout: 'layouts/sf_label', locals: { title: 'Edit Car' } %>
</div>

工作的“新”部分形式是:

<div class="span8">
  <%= simple_form_for @car,
                      defaults: {label: false},
                      html: {class: 'form-vertical'},
                      wrapper: :vertical_form,
                      wrapper_mappings: {
                              check_boxes: :vertical_radio_and_checkboxes,
                              radio_buttons: :vertical_radio_and_checkboxes,
                              file: :vertical_file_input,
                              boolean: :vertical_boolean
                      } do |f| %>
      <%= f.input(:stock_number, {input_html: {form: 'new_car', car: @car},  autocomplete: :off, placeholder: 'Stock number?'}) %>
      <input type="submit" form="new_car" value="Create Car" class="btn btn-default btn btn-primary">
  <% end %>
</div>

失败的“编辑”部分是:

<div class="span8">
  <%= simple_form_for @car,
                      defaults: {label: false},
                      html: {class: 'form-vertical'},
                      wrapper: :vertical_form,
                      wrapper_mappings: {
                              check_boxes: :vertical_radio_and_checkboxes,
                              radio_buttons: :vertical_radio_and_checkboxes,
                              file: :vertical_file_input,
                              boolean: :vertical_boolean
                      } do |f| %>
      <%= f.input(:stock_number, {input_html: {form: 'edit_car', car: @car}, autocomplete: :off, placeholder: 'Stock number?'}) %>
      <input type="submit" form="edit_car" value="Update Car" class="btn btn-default btn btn-primary">
  <% end %>
</div>

new_car 的 HTML 表单和按钮是:

<input type="text" value="" placeholder="Stock number?" name="car[stock_number]" id="car_stock_number" form="new_car" class="string required" car="#&lt;Car:0x9830ef8&gt;">

<input type="submit" class="btn btn-default btn btn-primary" value="Create Car" form="new_car">

edit_car 的 HTML 表单和按钮是:

<input type="text" value="AStock" placeholder="Stock number?" name="car[stock_number]" id="car_stock_number" form="edit_car" class="string required" car="#&lt;Car:0x62ebd08&gt;">

<input type="submit" class="btn btn-default btn btn-primary" value="Update Car" form="edit_car">

Gemfile 是:

source 'https://rubygems.org'
ruby '2.0.0'
gem 'rails', '4.0.3'
gem 'sass-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jquery-turbolinks'
gem 'jbuilder', '~> 1.2'
gem 'bootstrap-sass'
gem 'figaro'
gem 'pg'
gem 'simple_form', '3.0.1'
gem 'thin'
gem 'devise'
gem 'cancan'
gem 'rolify'
gem 'acts_as_tenant'
gem 'jquery-datatables-rails', github: 'rweng/jquery-datatables-rails'
gem 'jquery-ui-rails'
group :production do
  gem 'rails_12factor'  # For Heroku
  end
group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'guard-bundler'
  gem 'guard-rails'
  gem 'guard-rspec'
  gem 'hub', :require=>nil
  gem 'quiet_assets'
  gem 'rails_layout'
  gem 'rb-fchange', :require=>false
  gem 'rb-fsevent', :require=>false
  gem 'rb-inotify', :require=>false
end
group :development, :test do
  gem 'factory_girl_rails'
  gem 'rspec-rails'
end
group :test do
  gem 'database_cleaner', '1.0.1'
  gem 'email_spec'
end

为 new_car 生成的表单标签:

<form novalidate="novalidate" method="post" id="new_car" class="simple_form form-vertical" action="/cars" accept-charset="UTF-8">

为edit_car生成的表单标签:

<form id="edit_car_53" class="simple_form form-vertical" novalidate="novalidate" method="post" action="/cars/53" accept-charset="UTF-8">

【问题讨论】:

  • 会不会是 form="edit_car" 让它不起作用?您是否尝试过使用 form="new_car" 作为新操作?
  • 嗯,按钮的form属性应该和form中的form属性一样,就是edit_car。但是,在尝试任何事情一次的概念下,我尝试了它。结果一样,基本没有反应。但是,谢谢。
  • 您如何提交表单?您是否使用 Javascript 扫描表单然后在有效时提交?
  • 在使用完整表单时,我在表单中运行 jQuery。为了诊断这个问题,我消除了所有这些输入并删除了 jQuery 代码。这个问题没有我提供的 JavaScript 代码,但是 SimpleForm 和其他 gem 可能有 js 代码。
  • @Graeme McLean -- 实际上,我只是在表单定义中添加了 id: 'edit_car' 并触发了!请将您的回复更新为正式答案,以便我接受。感谢所有帮助!

标签: html ruby-on-rails forms


【解决方案1】:

按照 Graeme McLean 的要求,我在问题中输入了 HTML 表单标签。在那里,我注意到 form 属性不是 edit_car,正如我所料,而是 edit_car_[:id],例如 edit_car_53。结果,提交按钮与表单断开连接并且不会触发。为了解决这个问题,我将表单更新为只使用edit_car,如下:

  <%= simple_form_for @car,
                      defaults: {label: false},
                      html: {id: 'edit_car', class: 'form-vertical'},
                      wrapper: :vertical_form,
                      wrapper_mappings: {
                              check_boxes: :vertical_radio_and_checkboxes,
                              radio_buttons: :vertical_radio_and_checkboxes,
                              file: :vertical_file_input,
                              boolean: :vertical_boolean
                      } do |f| %>

这解决了这个特定的问题,这要感谢许多响应者,尤其是 Graeme。

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2012-06-28
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多