我正在尝试在更改选项时自动提交远程表单。当我从表单标记中删除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();
是问题所在。如何才能成功提交此表单?
答案 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 %>