yer*_*syl 33 html ruby-on-rails reactjs
使用Rails,我使用form_for标记创建表单.
Rails自动生成HTML表单,包括authenticity_token,以防止跨站点请求伪造(CSRF).
使用React我使用JSX,因此我无法在React组件中呈现erb.
在React组件中,我手动编写HTML.
我想在我的Rails应用程序中使用React,并且仍然具有Rails的优点.
或者,如果在使用React作为我的应用程序的V时无法获得form_for的Rails优势,我该如何编写一个适当的表单作为React组件?
如果我首先编写我的form_for,然后查看渲染的HTML,复制它,并粘贴到我的React组件中,这是一个好主意吗?
例如,这里是form_for呈现的HTML:
<form class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓" /><input type="hidden" name="authenticity_token" value="1AXH9blzaH4qEAAWTvu6aAH84btA/9DZCpFDBhiJ0/H9uAKsPAB/rFQWY1VmWA1yNtFaigO50p6joa3X8CItBA==" />
<div class="field">
<label for="user_???">???</label><br>
<input placeholder="??? ?????" type="text" name="user[name]" id="user_name" />
</div>
<div class="actions">
<input type="submit" name="commit" value="??????? ??????" class="button tiny" />
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
Pav*_*kov 36
您可以粘贴authenticity_token
到react组件中.
运用 gem react-rails
= react_component 'Form', authenticity_token: form_authenticity_token
Run Code Online (Sandbox Code Playgroud)
form_authenticity_token
铁路助手.
所以你可以将它粘贴到表单中.
<form role='form' accept-charset="UTF-8" action='/action' method='post'>
...
<input type='hidden' name='authenticity_token' value={this.props.authenticity_token} />
...
</form>
Run Code Online (Sandbox Code Playgroud)
这不是最好的解决方案.如果有人能说出更好的解决方案,我会很高兴.
Bla*_*son 13
你可以这样做:
$(document).ready(function(){
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}
});
});
Run Code Online (Sandbox Code Playgroud)
并将其csrf-token
放入视图/布局中的元标记中(如果尚未存在).
如果使用Rails呈现基本HTML并使用它嵌入React组件,则react-rails
可以这样写:
var YourForm = React.createClass({
render: function() {
var csrfToken = $('meta[name=csrf-token]').attr('content');
return (
<form action='/users' method='post' accept-charset='UTF-8'>
<input type='hidden' name='_method' value='patch' />
<input type='hidden' name='utf8' value='?' />
<input type='hidden' name='authenticity_token' value={csrfToken} />
...
</form>
);
}
});
Run Code Online (Sandbox Code Playgroud)