我自己构建了表单标记,当我将表单发布到服务器时,它会给我一个InvalidAuthenticityToken
错误,所以我想知道如何在当前情况下添加它:
<form accept-charset="UTF-8" action="/crops/update" method="post">
<input id="crop_x" name="crop_x" size="30" type="text" /><br />
<input id="crop_y" name="crop_y" size="30" type="text" /><br />
<input id="crop_w" name="crop_w" size="30" type="text" /><br />
<input id="crop_h" name="crop_h" size="30" type="text" /><br />
<input id="crop" name="crop" type="submit" value="Crop!" />
</form>
响应错误是:
ActionController::InvalidAuthenticityToken in CropsController#update
ActionController::InvalidAuthenticityToken
Rails.root: /home/mlzboy/my/crop2
Application Trace | Framework Trace | Full Trace
答案 0 :(得分:69)
有一个名为form_authenticity_token
的视图帮助程序,它返回当前会话的真实性标记。
在view.html.erb中:
<form action="/blah" method="POST">
<input name="authenticity_token" value="<%= form_authenticity_token %>" type="hidden">
<input name="first_name" type="text">
</form>
答案 1 :(得分:6)
这个答案首先适用于Google中的 rails form token tag ,以便日后使用谷歌搜索更简单:只需使用token_tag
,它就是ActionView::Helpers::UrlHelper
中定义的助手返回隐藏输入,默认值为form_authenticity_token
。
答案 2 :(得分:0)
要生成令牌,您必须使用 @flitzwald 正确记录的方法form_authenticity_token
。由于它在活动控制器中被重新关注,因此在使用之前必须将模块明确地包含在控制器中,如下所示:
include ActionController::RequestForgeryProtection
# use
def set_csrf_header
response.headers['X-CSRF-Token'] = form_authenticity_token
end
答案 3 :(得分:-1)
这就是我所做的并且有效:
<form action="/users/sign_in" method="post" accept-charset="UTF-8" class="login-form new_user" id="new_user">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" value="<%= form_authenticity_token %>" type="hidden">
<label for="user_email">
<span>Email:</span>
<input autofocus="autofocus" type="email" name="user[email]" id="user_email" required />
</label>
<label for="user_remember_me">
<span>Password:</span>
<input autocomplete="off" type="password" name="user[password]" id="user_password" required />
</label>
<a href="#" class="forgot-password-link">Forgot your password?</a>
<button type="submit" class="btn btn-primary submit">Log In</button>
</form>