2015-09-12 4 views
2

Я следую за эти две обучающие программы в целом,Rails не создает подлинность маркера

и реализует простую систему комментариев в Rails. Однако у меня возникла проблема с обработкой отправки. Я выполнил простой запрос AJAX POST для отправки данных моей формы (как состояние). Это выглядит следующим образом:

var CommentForm = React.createClass({ 
    handleChange: function(e) { 
    var name, obj; 
    name = e.target.name; 
    return this.setState((
     obj = {}, 
     obj["" + name] = e.target.value, 
     obj 
    )); 
    }, 
    handleSubmit: function(e) { 
     e.preventDefault(); 
     var author = React.findDOMNode(this.refs.author).value.trim(); 
     var text = React.findDOMNode(this.refs.text).value.trim(); 
     if(!text || !author) { 
      return; 
     } 
     $.post(this.props.postUrl, {comment: this.state}, null, "application/json"); 
     React.findDOMNode(this.refs.author).value = ''; 
     React.findDOMNode(this.refs.text).value = ''; 
    }, 
    render: function() { 
     return (
      <form className="commentForm" onSubmit={this.handleSubmit}> 
     <input type="text" placeholder="Your name" ref="author" name="author" onChange={this.handleChange} /> 
     <input type="text" placeholder="Say something..." ref="text" name="text" onChange={this.handleChange} /> 
     <input type="submit" value="Post" /> 
     </form> 
     ); 
    } 
}); 

Как я изучил консоль Похоже, она проходит в правильном пути и правильный Params, за исключением не authenticity_token паров. Вот скриншот того, что находится в консоли.

enter image description here

В первой ссылке, которую я предоставил, он сказал, что jquery_ujs обрабатывает генерации и передачи маркера подлинности для Ajax POST. Однако это не так в моем случае. Что мне не хватает?

Редактировать: У меня есть несколько ответов, которые помогут решить мою проблему. Тем не менее, я по-прежнему занимаюсь любопытством в отношении того, что делает разницу между моим кодом и кодом в этом учебнике?

ответ

0

решаемая. Убрана линия

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

из application.html.erb. Оказывается, это было затенение jquery_rails при создании запроса AJAX.

1

Это потому, что вам не хватает в вашем методе render, чтобы передать authenticity_token. Либо вы отключите проверку подлинности (не), либо вы доставляете свою визуализованную форму с помощью токена аутентификации.

В этом случае я бы рекомендовал использовать Гон для чистого прохождения переменного контроллера в JS: https://github.com/gazay/gon

Когда вы установили:

В вашем методе контроллера:

gon.authenticity_token = form_authenticity_token 

В вашем класс реакции:

<form className="commentForm" onSubmit={this.handleSubmit}> 
    <input type="hidden" name="authenticity_token" value={gon.authenticity_token} /> 
    <input type="text" placeholder="Your name" ref="author" name="author" onChange={this.handleChange} /> 
    <input type="text" placeholder="Say something..." ref="text" name="text" onChange={this.handleChange} /> 
    <input type="submit" value="Post" /> 
</form> 
+0

Спасибо за решение! Я тоже не собирался отключать чек.Но я все еще удивляюсь, что отличает его учебник от моего кода? –

+0

Я только что проверил его учебник, он не вставлял свой ApplicationController, поэтому я не могу сказать, активирован ли он 'protect_from_forgery' или нет, по крайней мере, в его собственных контроллерах он не использует его – wiesion

+0

Да, подумал об этом , но он прямо говорит, что: «Если вы использовали другие JS-фреймворки вместе с Rails (например, AngularJS) для создания похожих функций, возможно, у вас возникли проблемы, потому что ваши запросы POST не включают токен CSRF, требуемый Rails , поэтому почему мы не столкнулись с этой проблемой? Просто потому, что мы используем jQuery для взаимодействия с нашим бэкэнд, а ненавязчивый драйвер Rails jquery_ujs будет включать токен CSRF для каждого запроса AJAX для нас. Вот что меня смущает. Просто отправил ему электронное письмо. –

1

Вы купите л.д. добавить атрибут authenticity_token к вашему AJAX POST:

вы могли бы заменить эту строку:

$.post(this.props.postUrl, {comment: this.state}, null, "application/json"); 

с этим:

$.post(this.props.postUrl, { 
    comment: this.state, 
    authenticity_token: $('meta[name=csrf-token]').attr('content') 
    }, null, "application/json");