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 %>
此外,在该表单中添加 <input type="hidden" name="authenticity_token" id="authenticity_token" value="ANYTHING" />
仍然可以发布信息并创建新记录...
【问题讨论】:
当这样调用时,您可以发送局部变量: :token => 'kasdlfjasldfj' %form_for
builder 或 form_tag
通常负责添加一个带有真实性令牌的隐藏字段,你能告诉我们shared/comment_form
的形式吗?
【参考方案1】:
在您的情况下,我们有两种方法:
在表单选项中添加authenticity_token: true
手动将authentity_token字段添加到表单中,如下所示:
<%= hidden_field_tag :authenticity_token, form_authenticity_token -%>
【讨论】:
是的,这是解决方案,但也有必要解释正在发生的事情以了解为什么会发生这种情况,我在下面的答案中添加了这一点 我认为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 一起使用?