我在视图中有一个搜索表单。
<%= form_with url: issues_path, class: 'filter-box' do %>
<%= text_field_tag(:filter_by, '', id: 'filter-text-field') %>
<% end %>
提交表单后,将执行以下操作:
class IssuesController < ApplicationController
...
def create
@labels = Label.by_search_term(params[:filter_by])
respond_to do |format|
format.js
end
end
end
一切正常。
但是,我希望每次击键都能触发该动作。为此,我添加了以下javascript。
<script>
document.getElementById('filter-text-field').addEventListener('keyup', function(){
document.querySelector('.filter-box').submit()
})
</script>
但是,在按键提交表单时,它中断了,并且出现错误:ActionController::UnknownFormat in IssuesController#create
。
看着参数,我看不到任何值得注意的东西。
# Submitted by pressing return
# => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"TJRajeBbEK8+D0Ly5/lbI/SVx8srhG/YS2W1l+Zc+f+TYmsbfehXnsluxOovblCrWBLJy0exhyzhsY+qPhBDOQ==", "filter_by"=>"d", "controller"=>"issues", "action"=>"create"} permitted: false>
# Submitted on keyup
# => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"7NBwqCuJpbFGvxWgq6qqdB1hF0yptca0N446G4nQ620zJkE+tjrigLHek7hjPaH8seYZTMWALkCdWgAmUZxRqw==", "filter_by"=>"d", "controller"=>"issues", "action"=>"create"} permitted: false>
按Enter提交表单与通过javascript提交表单有什么区别?我该怎么做才能确保其正常工作?
答案 0 :(得分:2)
Rails的form_with
帮助程序默认将表单设置为remote: true
。因此,当您提交表单时,Rails的UJS进入中间并创建ajax请求。当您在表单上使用submit()
方法时,它不允许Rails正确处理ajax请求,因为它不会触发Rails期望的事件。
您可以使用Rails的javascript对象帮助器方法来触发提交,而不是使用javascript的submit()
方法。像这样:
document.getElementById('filter-text-field').addEventListener('keyup', function(){
Rails.fire(this.form, 'submit')
})
这将触发'submit'事件,而不是提交表单,因此现在所有rails的回调都将处理rails的属性,例如remote: true
,disable_with: ...
,confirm: ...
等。< / p>
编辑:附加参考: https://github.com/rails/rails/tree/master/actionview/app/assets/javascripts/rails-ujs
start.coffee设置事件回调,而utils / events.coffee定义fire
函数
EDIT2:这是Rails为表单的submit
事件https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/start.coffee#L55-L62
这是使用Rails的帮助器类https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/utils/event.coffee#L34
触发事件的功能我不确定是否为此提供DOC,我已经学会了自己阅读代码,除了来源以外,我不确定要指向您的位置,对不起!