Rails远程表单collection_select onchange错误

时间:2018-02-26 03:11:17

标签: ruby-on-rails ajax ruby-on-rails-5

我正在尝试在更改选项时自动提交远程表单。当我从表单标记中删除remote: true时,一切正常,但我不希望每次都重新加载页面。

我正在使用Rails 5.1.4。

代码

<%= form_for @foo, remote: true do |f| %>

    ... fields

    <%= f.collection_select :bar_id, @list, :id, :name,
       {include_blank: '-'}, { onchange: 'this.form.submit();'} %>

<% end %>

控制器

def update
  respond_to do |format|
    if @foo.update(foo_params)
      format.html { redirect_to @foo }
      format.json { render :show, status: :ok, location: @foo }
    else
      format.html { render :edit }
      format.json { render json: @foo.errors, status: :unprocessable_entity }
    end
  end
end

在视图中更新选择时,我收到以下错误:

  

的ActionController :: InvalidAuthenticityToken

我假设this.form.submit();是问题所在。如何才能成功提交此表单?

1 个答案:

答案 0 :(得分:0)

真实性令牌是在您的视图中生成的随机值,用于证明请求是从您网站上的表单提交的,而不是在其他地方提交的。这可以防止CSRF攻击

您可以通过两种方式避免上述错误

1)在应用程序控制器中添加以下代码

skip_before_filter :verify_authenticity_token  

参考链接:http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

2)在表单

中添加authenticity_token
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

<%= csrf_meta_tags %>