Ответ Javascript от Rails Controller приводит к Uncaught SyntaxError: Неожиданный токен: - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть форма, которая создает отношение, и когда форма отправляется, должен быть возвращен код javascript, который добавляет новые подключенные узлы и отношения, соединяющие их с графом цитопространства:

Форма:

<%= form_for Relation.new, :url => url_for(:controller => 'relations', :action => 'add_dependency'), remote: true do |f| %>
  <%= f.hidden_field :to_id, :value => @article.id %>
  <%= f.hidden_field :graph, :value => 1 %>
  <%= f.select :from_id, [], {}, {class: "select-article"} %>
  <%= f.submit "Add a dependency of this article." %>
<% end %>

Код контроллера:

  def add_dependency
    @relation = Relation.find_or_create_by(relation_params)
    @relation.user << current_user

    respond_to do |format|
      if @relation.save
        elements = json_for_cytoscape(@relation.from.self_and_all_dependencies_of_depth_and_less(3))
        format.json { render :show, status: :created, location: @relation }
        format.js { render js: "ancestors.add( #{elements} ); console.log('Hello');" }
      else
        format.json { render json: @relation.errors, status: :unprocessable_entity }
      end
    end
  end

Я получаю эту ошибку (и без "Hello") в консоли javascript:

Uncaught SyntaxError: Unexpected token :
    at processResponse (rails-ujs.self-8944eaf3f9a2615ce7c830a810ed630e296633063af8bb7441d5702fbe3ea597.js?body=1:244)
    at rails-ujs.self-8944eaf3f9a2615ce7c830a810ed630e296633063af8bb7441d5702fbe3ea597.js?body=1:173
    at XMLHttpRequest.xhr.onreadystatechange (rails-ujs.self-8944eaf3f9a2615ce7c830a810ed630e296633063af8bb7441d5702fbe3ea597.js?body=1:228)

Это ответ:

ancestors.add( {:edges=>[], :nodes=>[{:data=>{:id=>200, :title=>"Test Yourself: Area & arc length using calculus", :href=>"http://localhost:3000/articles/200", :rank=>0.000459770114943, :color=>"grey"}}]} ); console.log('Hello');

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Этот ответ не является допустимым JavaScript, и причина довольно проста.Когда вы приводите хэш Ruby к строке, результат является недопустимым JS:

irb(main):001:0> { :foo => 'bar'}.to_s
=> "{:foo=>\"bar\"}"

Вместо этого вам необходимо закодировать его как JSON.

irb(main):003:0> { :foo => 'bar'}.to_json
=> "{\"foo\":\"bar\"}"

Из-за проблем с цитированием легче сделатьесли вы фактически создаете представление вместо рендеринга inline:

ancestors.add( <%= elements.to_json %> ); 
console.log('Hello');
0 голосов
/ 25 ноября 2018

Я решил проблему, добавив to_json:

json_for_cytoscape(@relation.from.self_and_all_dependencies_of_depth_and_less(3)).to_json
...