Rails 4. 如何将authentity_token 添加到通过部分呈现的表单中?

Posted

技术标签:

【中文标题】Rails 4. 如何将authentity_token 添加到通过部分呈现的表单中?【英文标题】:Rails 4. How to add authenticity_token to forms rendered via partial? 【发布时间】:2016-06-30 06:10:14 【问题描述】:

在我的 rails 应用程序上,在所有页面的 head 部分都有这 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 %>

此外,在该表单中添加 &lt;input type="hidden" name="authenticity_token" id="authenticity_token" value="ANYTHING" /&gt; 仍然可以发布信息并创建新记录...

【问题讨论】:

当这样调用时,您可以发送局部变量: :token => 'kasdlfjasldfj' % form_for builder 或 form_tag 通常负责添加一个带有真实性令牌的隐藏字段,你能告诉我们shared/comment_form 的形式吗? 【参考方案1】:

在您的情况下,我们有两种方法:

    在表单选项中添加authenticity_token: true

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

&lt;%= hidden_field_tag :authenticity_token, form_authenticity_token -%&gt;

【讨论】:

是的,这是解决方案,但也有必要解释正在发生的事情以了解为什么会发生这种情况,我在下面的答案中添加了这一点 我认为form_authenticity_token 是您实际身份验证令牌的占位符,但令人惊讶的是,这是一种实际方法,它将返回会话的 CSRF 令牌或即时生成一个。好的! github.com/rails/rails/blob/4-0-stable/actionpack/lib/…【参考方案2】:

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

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

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

【讨论】:

以上是关于Rails 4. 如何将authentity_token 添加到通过部分呈现的表单中?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4. 如何将authentity_token 添加到通过部分呈现的表单中?

如何将参数传递给 Rails 4 中的 has_many 关联范围?

如何让 Jquery UI Autocomplete 与 Rails 4 一起使用?

如何向 Rails 4 中的所有 ActiveRecord 模型添加 `audited` 方法调用?

Rails 4 - 将日期时间转换为单独的日期和时间字段

rails 4:将 routes.rb 拆分为多个较小的文件