Rails 4. partial渲染的表单如何添加authenticity_token?

Rails 4. How to add authenticity_token to forms rendered via partial?

在我的 rails 应用程序的所有页面上,在标题部分有以下 2 个元标记:

<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="027GUZBeEkmv..." />

在未使用部分呈现的表单上有一个隐藏的 authenticity_token 字段

<input type="hidden" name="authenticity_token" value="D5TddQruJppDD3..." />

但是如果我像这样简单地加载表单,这个字段就会丢失:

<%= render 'shared/comment_form' %>

这是预期的行为吗?我应该手动添加 authenticity_token 吗?如果是,我该如何验证它?

编辑:

shared/_comment_form.html.erb

<%= form_for([@post, @comment], :html => { :onsubmit => "validateCommentForm(event)" }, remote:true) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
    <div class="field">
        <%= f.text_area :content, placeholder: "Add to the article. Make it be more" %>
    </div>

    <%= f.submit "Save", class: "btn btn-info" %>
<% end %>

此外,向该表单添加 <input type="hidden" name="authenticity_token" id="authenticity_token" value="ANYTHING" /> 仍然设法 post 信息并创建新记录...

好的,看来它是关于远程表单而不是通过部分加载的表单:

已将 config.action_view.embed_authenticity_token_in_remote_forms 的默认值更改为 false。此更改破坏了在没有 JavaScript 的情况下也需要工作的远程表单,因此如果您需要这种行为,您可以将其设置为 true 或显式传递 authenticity_token: true 在表单选项中。

在这里找到答案:https://github.com/rails/rails/issues/10608

对于您的情况,我们有两种方法:

  1. 在表单选项中添加authenticity_token: true

  2. 手动将 authenticity_token 字段添加到表单中,如下所示:

<%= hidden_field_tag :authenticity_token, form_authenticity_token -%>