В принципе, у меня есть одна страница TODOAPP, которая отображается в Rails на Index.html.erb, и я пытаюсь отобразить созданные объекты TODO через index.js.erb, потому что у них есть форма, прикрепленная к каждому из них, для которого требуется подлинность токен от помощника рельсов. Предоставление TODO через/в Javascript является необходимостью.
Мое решение состояло в том, чтобы попытаться добавить todos к представлению Index.html.erb через параметр render "index.js.erb" в индексе и вызвать частичное, которое будет отображать в рубине, а затем запустить ('<% = j render 'index.html.erb'%>). Тем не менее, это ожидает частичный _index, и просто пытается добавить или даже запустить что-либо непосредственно в index.js.erb, фактически приводит к тому, что сама страница будет отображаться.
Конечно, я понимаю, что это проблема маршрутизации, но я все равно не могу найти объекты TODO для DOM через /JS и включить токен аутентификации в том виде, в котором они были завернуты, поскольку добавление формы в dom через jquery в файле.js не позволит включить токен.
Я бы очень признателен за любую возможную информацию, которую вы могли бы иметь, потому что я исчерпал онлайн-поиск и видео на YouTube в этот момент. Действие моего контроллера индекса:
def index
@todo = Todo.new
@todos = Todo.all
respond_to do |format|
format.html { render 'index.js.erb' }
format.json { render :json => @todos }
format.js { render 'form.js.erb' }
end
end
И репозиторий GITHUB: https://github.com/jwolfe890/todoapp/blob/master/app/assets/javascripts/todo.js
Огромное спасибо за любую проницательность!
Вместо того, чтобы сообщать, что делать в html-формате, вы можете оставить его, чтобы он index.js.erb
как обычно. Таким образом, index.js.erb
будет отображаться как "нормально", а в формате json будут ваши @todos, например:
def index
@todo = Todo.new
@todos = Todo.all
respond_to do |format|
format.html { }
format.json { render json: @todos }
format.js { }
end
end
И чтобы регенерировать токен каждый раз, когда вы делаете запрос, вы можете использовать обратный вызов after_action, например:
after_action :add_csrf_token_to_json_requests
private
def add_csrf_token_to_json_requests
if request.xhr? && !request.get? && protect_against_forgery?
response.headers['X-CSRF-Token'] = form_authenticity_token
end
end
И в вашем приложении application.js каждый раз, когда запрос ajax был завершен, устанавливается csrf-токен:
$(document).ajaxComplete(function(event, xhr,settings) {
header_token = xhr.getResponseHeader('X-CSRF-Token');
if (header_token) $('meta[name=csrf-token]').attr('content', header_token)
});
Я нашел способ взять токен аутентификации из заголовка макета из этого сообщения POST-запрос, сделанный с помощью Authenticity Token, но исключение все еще сбрасывается, но маршрутизация и рендеринг из js.erb все еще не работают.