Проблемы с рендерингом в Index.html.erb из Index.js.erb в Rails с использованием токена подлинности Ajax

3

В принципе, у меня есть одна страница 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

Огромное спасибо за любую проницательность!

2 ответа

2
Лучший ответ

Вместо того, чтобы сообщать, что делать в 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)
});
  • 0
    Сначала я попробовал это, и это работает для вызова AJAX в Index, но мне нужен способ добавить эти объекты (или rails объекты) в DOM частично через ERB, потому что это единственный способ, который позволил бы мне автоматически генерировать токен аутентификации. Я думаю, что у меня есть жизнеспособный обходной путь через мета-тег макета, но я не могу запустить index.js.erb в дополнение к .html.erb
  • 0
    Где вы столкнулись с проблемой с токеном? Я попытался создать и отредактировать задачу, и это сработало, единственное, что не сработало, это запрос PUT.
Показать ещё 7 комментариев
3

Я нашел способ взять токен аутентификации из заголовка макета из этого сообщения POST-запрос, сделанный с помощью Authenticity Token, но исключение все еще сбрасывается, но маршрутизация и рендеринг из js.erb все еще не работают.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню